C++中const的用法
本文是个人针对《C++ Primer(第5版)》的个人理解和网上相关博文整理而成。若有不妥处欢迎留言指出,谢谢!
一、const与普通变量、指针和引用
1、const修饰普通变量
希望定义一种变量,其值不被改变。写法如下:
1 const Type var=Tvalue; //Type为(内置或别的)类型
使用的注意点是:因为const对象一旦创建后其值不能在改变,所以const对象必须初始化。
2、const与指针和引用
(1)与指针
与指针的结合中,const的位置不同,导致的含义也不同。这里省略初始化的考虑,仅给出等号左侧的形式。(初始化时,等号右侧或花括号中的值或变量要和等号左侧相匹配)
1 const double *p; //情况1 2 double *const p; //情况2 3 const double *const p; //情况3
(a)情况1,指针p指向的是一个double常量(指向常量的指针),即不能通过指针p去改变其指向对象的值,但没有规定那个对象不能通过其他的途径改变(其他途径是什么不觉明历)。
1 const double pi=3.14; //pi为常量 2 const double *p=π //p指向一个双精度常量 3 *p=42.1; //错误,不能给*p赋值
这里值得注意的是允许一个指向常量的指针指向一个非常量对象(和常量引用一样),即等号两边类型不匹配(特例)。
1 double dval=3.14; 2 p=&dval; //正确!!但不能通过指针p(为上段代码中)改变dval的值
(b)指针本身为常量,即常量指针,常量指针,指针本身的值不变,故必须初始化。情况2,p为指向double的常量指针。常量指针并不意味着不能通过指针去修改其指向对象的值,能否这样做完全依赖所指对象的类型。
1 double num=3.14; 2 double *const p=# 3 *p=0.0; //可以通过p修改num的值 4 5 //p为指向常量对象的常指针,则不能。如: 6 const double num1=3.14; 7 const double *const p=&num1; 8 *p=2.72; //错误
注:情况1和情况2的区分方法,关键看const和*的位置关系:
如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即为指向常量的指针;
如果const位于*的右侧,const就是修饰指针本身,指针本身是常量,即为常量指针。
(c)情况3,是情况1和2的混合,即,指针和其指向的对象都不可变。
(2)与引用
因为引用不是对象,所以没有常量引用(类似指针中的情况2),只有对常量的引用(类似指针的情况1)。
1 const double dval=3.14; 2 const double &r=dval; 3 r=4.2; //错误,r为对常量的引用,和指针中情况1类似
对const的引用可能引用一个并非const的对象(和指针的情况1一致)
1 double dval=4.2; 2 double &r=dval; //正确 3 const doulbe &r1=dval; //正确!但不能通过r1改变dval的值
注:这里和指针情况1有点不同的是,引用一旦初始化,就不可改变引用对象。详见博文指针与引用。
二、修饰函数参数
1、表示函数体中不能修改参数的值,包括参数本身的值和参数其中包含的值。
1 double func(const double *var) ; //参数为指针指向的内容为常量,不可变
2、和引用结合
使用引用做形参的好处是避免拷贝。当不会改变形参时,利用const和引用结合避免形参被改变,另外,使用引用而非常量引用也会极大地限制函数所能接受的实参类型。例如,我们不能把const对象、字面值或者需要类型转换的对象传递给普通的引用形参。
1 double func(const double &var); //var既可以是常量也可以非常量
三、const修饰成员函数
使用const的成员函数称为常量成员函数。
1 struct Sales_data 2 { 3 string isbn() const {return bookNo;} //const的用法 4 ..... 5 } 6 7 Sales_data total; 8 total.isbn();
成员函数通过一个名为this的额外的隐式参数来访问它的那个对象。默认情况下,this的类型是指向类类型非常量版本的常量指针。这里是,Sales_data *const。尽管this是隐式的,但它仍然需要遵循初始化规则,意味着(在默认情况下)我们不能把this绑定到一个常量对象上(见上面的一种的(2))。这样使得我们不能在一个常量对象上调用普通的成员函数。在isbn函数体内不会改变this所指的对象。(不改变this指针本身,也不改变其指向对象,类似于一中情况(3))。因为this是隐式,所以在函数体前加上一个const来实现这个目的。
注意两点:
(1)常量成员函数不能修改任何成员变量(mutable修饰的变量除外);
(2)常量成员函数不能调用非constconst成员函数,因为非const成员函数可以修改成员变量。
四、const此时函数返回值
const修饰函数返回值不多见,其含义和const修饰普通变量及指针含义相同。
1 const int *func1(); 2 const int *p=func1(); //调用 3 4 int const *func2(); 5 int const *p=func2(); //调用
Ref:
http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html