本文参考《C++编程思想》第八章内容,看过这本书的,请无视以下内容。

在C++中,const一共有四个作用,分别用于值替代、指针、函数参数和返回以及类。

一 值替代

1.const最初的动机就是值替代,也就是说,以前在C语言里,值替代的典型用法是这样的:

#define BUFSIZE 100

现在可以用:

const  int  bufsize = 100;

这样替换的好处是可以进行类型检查,避免出现一些问题。

2.这样定义的const的值在编译期间就能确定,因此可以用于定义数组,比如:

char buf[bufsize];

3.const变量定义时必须初始化。应该这样:

const int a =100;

如果只是声明:

const int a;

会报错的,不信你试试?

4.原因是C++中const变量默认的是内部连接,也就是在变量所在文件内有效,相当于static的效果,因此在不同的文件中定义同名的const变量是没有任何问题的。但是如果多个文件要共用同一个const变量应该怎么办呢?在某一处定义并初始化,像这样:

extern cons tintx = 1;

并在其他文件里声明:

extern constint x;

所以,const变量在定义时就得初始化的原因就是:把定义和声明区别开。

二 指针

1.指向const的指针

const int * u;
int const * u;

这两者的意思都是:u是一个int型指针,指向一个constint。也就是指向常量的指针。

2.const指针

int d = 1;
int * const w =&d;

w为一个int型指针,指向一个int值,w指针本身不变。

Ps:为什么有两条语句,参照上文,const变量定义时需要初始化。

3.结合第一点和第二点,可以定义一个指针不变并且指针指向的值也不变的const量,怎么写呢,你猜?

4.可以将一个非const变量的地址赋给const指针,但不能将一个const值的地址赋给一个非const指针。

int d = 1;
const int a = 1;
const int * b =&d;   //right
int * c =&a;    //wrong

三 函数参数和返回类型

1.const变量按值传递,则该值不能改变。

void f1(constint i) {i++; //wrong
}

2.const量作为返回值时,没什么意义。因为起不到想要的效果,你可以试一下。

3.const指针作为函数参数的情况。这种情况比较复杂,只需要记住,对于用户自定义的数据类型,当用该类型的引用作为函数参数的时候,一定要加const。

四 类

1.const类型的成员变量及其初始化

class Integer {int i;
public:Integer(int ii = 0) ;void print();
};Integer::Integer(int ii = 0) : i(ii) {}
void Integer::print() { cout << i << ' '; }

2.编译期间类里的常量。必须在定义的时候初始化。

class StringStack {static const int size = 100;const string* stack[size];int index;
public:StringStack();void push(const string* s);const string* pop();
};StringStack::StringStack() : index(0) {memset(stack,0,size * sizeof(string *));
}
void StringStack::push(const string* s) {if(index < size)stack[index++] = s;
}
const string* StringStack::pop() {if(index > 0) {const string* rv = stack[--index];stack[index] = 0;return rv;}return 0;
}

3.const对象的概念是对象的数据成员在其生命周期内不被改变。因此,它只能调用const成员函数,不能调用非const成员函数,因为那有可能改变数据成员。

class Quoter {int lastquote;
public:Quoter();int lastQuote() const;
};Quoter::Quoter() {lastquote = -1;srand(time(0));
}
int Quoter::lastQuote() const {return lastquote;
}

C++中的const用法相关推荐

  1. C语言返回值是const类型,C++中const用法总结

    1.1.1. 定义普通常量 使用#define来定义常量也是常用方法,但const也可以用来定义常量,在[Effective C++]中建议使用const代替#define来定义常量,因为const定 ...

  2. C++中const用法总结

    2019独角兽企业重金招聘Python工程师标准>>> . const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE cons ...

  3. c/c++中const用法总结

    const类型定义:指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令 **************常量必须被初始化************************* cons的作用    ...

  4. 【C++】C/C++ 中 static 的用法全局变量与局部变量

    C/C++ 中 static 的用法全局变量与局部变量 目录 1. 什么是static? 1.1 static 的引入 1.2 静态数据的存储 2. 在 C/C++ 中static的作用 2.1 总的 ...

  5. C++中的const关键字(zz)

    [补充]mutable关键字 有时我们希望类的数据成员即使在const成员函数中,依然是可以修改的,这时就可以把它们声明为mutable来实现.这样的应用,比如记录各种操作的调用次数,这时,即使在co ...

  6. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  7. php定义枚举,PHP中Enum(枚举)用法实例详解

    本文实例讲述了PHP中Enum(枚举)用法.分享给大家供大家参考,具体如下: PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持. (1 ...

  8. C/C++常用宏定义,注意事项,宏中#和##的用法

    总结下宏和函数的不同之处,以供大家写代码时使用,这段总结摘自<C和指针>一书. 当然宏定义非常重要的,它可以帮助我们防止出错,提高代码的可移植性和可读性等. 下面列举一些成熟软件中常用得宏 ...

  9. JAVA中Final的用法

    JAVA中Final的用法 1. 修饰基础数据成员的final 这是final的主要用途,其含义相当于C/C++的const,即该成员被修饰为常量,意味着不可修改.如java.lang.Math类中的 ...

最新文章

  1. linux终端字体大小6,[adminitrative][archlinux][setfont] 设置console的字体大小
  2. 英语音标 [j] yes
  3. matlab中的方波信号图片_电气信息类专业课程之matlab系统仿真 第十章 DBPSK调制解调器(9)...
  4. C#通用类Helper整理
  5. MySQL子查询的使用
  6. 鸿蒙系统基础是云计算吗,国内两大系统横空出世,鸿蒙不算啥,这系统才叫牛...
  7. Archlinux 升级 pacman 时遇到的问题及其解决
  8. linux学习入门之Linux系统目录结构
  9. 西门子S7-200 SMART编程软件下载
  10. 中文字体的英文名称(宋体 微软雅黑)
  11. CRC校验算法的Verilog实现
  12. bak 服务器备份文件怎么恢复,bak文件怎么还原
  13. python:兔子繁殖问题
  14. 安装linux系统提示acpi,ACPI引起linux系统无故重启
  15. [好消息]大连.NET俱乐部QQ群开放注册~~~注册有好礼!
  16. VS2010连接数据库的操作(SQLServer2005/2008 以及Access2007/2003等)
  17. 七牛云 Java Web上传图片
  18. 什么,你还在一条一条的insert?
  19. jsp电影评论网站ssh框架
  20. 如何学习python

热门文章

  1. stable diffusion webui mov2mov
  2. matlab标准化还原,1.2基于MATLAB的数据预处理(标准化变换部分)
  3. c1000k 高性能服务器构建技术,C1000K高性能服务器构建技术.ppt
  4. 2007年十二星座运势
  5. 【计量经济学导论】13. 虚拟变量与双重差分
  6. 使用canvas绘制小黄人
  7. SpringBoot通过AOP实现系统日志记录(一)-Controller层日志监控
  8. Error: only one instance of babel-polyfill is allowed
  9. vue中实现锚点定位以及平滑滚动到指定位置
  10. VC编程中经常能遇到LNK2005错误