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

http://www.cnblogs.com/xudong-bupt/p/3509567.html

posted @ 2017-08-14 20:36  王大咩的图书馆  阅读(782)  评论(0编辑  收藏  举报