C++中的const是一个很烦人的东西,其用法比较多样化,比如说在声明变量的时候既可以放在前面,也可以放在后面。且与之相关一些概念往往容易使人混淆,使用的时候很容易出错。于是重翻了《C++ Primer》,总结一下const的各种用法。
1.定义常量
const最常见的用法,将一个变量声明为const型,则其值不能再被更改。有如下两种定义方式:
const int var1 = 12;
int const var2 = 13;
第一种更为常见,此外还有两点要注意:
1)const量在声明的时候必须初始化
2)const对象默认为文件的局部变量,若要使其具有全局可见性,需要在声明的时候加上extern。
2.在函数中使用const
有以下三种用法:
1)const修饰函数参数:
void List(const List & alist);
参数不会被函数所更改,由于C++是的参数是值传递的,普通变量通常也不会被更改,因此通常是和引用配合使用。
2)const修饰函数返回值:
const int func(int arg1, int arg2);
和修饰变量是一样的,比较少见的用法。
3)const修饰类的成员函数
void display(ostream & out) const;
const修饰的成员函数不会更改其对象的数据成员,
3.const与指针
const与指针混用是const用法中最容易混淆的部分,厘清的关键在于区分清楚const修饰的是指针本身还是指针所指的对象。
1)指向const对象的指针
声明方式为:
int var1 = 12;
const int *p = var1;
*p = 15; // error: p could not change var1
这一类指针无法更改其所指向对象的值。就上面的例子来说,更改*p,比如对其赋值,是非法的。不过这个例子一个有意思的地方在于var1本身并不是const的,也就是说,虽然通过指针p不能更改var1的值,但其他方法还是可以的,比如直接对var1赋值,那么*p其实也被改变了。
对这一现象,《C++ Primer》中有个精到的描述:“指向const对象的指针可以被理解为自以为指向const对象的指针”。
2)const指针
另一种情况是const修饰的是指针本身:
int var1 = 12;
int var2 = 13;
int const *p = var1;
p = var2; // error: p could not be changed
*p = 15; // change *p is ok
这种情况下指针本身是不能改变的,但是指针所指向的对象却可以修改
4 .const引用
const引用通常代表的含义是指向const对象的引用,也就是说它和以上指针的第一种情况类似(虽然名字和第二种类似),同样它也是“自以为”的,并不能保证对象绝对不会被修改。
const引用通常用于作函数的参数,因为引用作为参数传递效率会更高,但引用会造成参数被更改,因此可以用const修饰。