const的作用

1. 修饰变量

具有常属性,可以在定义数组的时候用该变量定义,每次取值从寄存器中取,在编译过后,直接将对应的值,替换到当前变量的位置。与之相对的是volatile。被这个关键字修饰的话,代表告诉了编译器,这个变量时随时可能被修改的。

防止编译器优化,每次读取该值时,从内存中读取。而不是从编译器优化的寄存器中读取。C++中,被const修饰的变量,会在编译期间将对应的变量,直接替换为该变量的值。但是C语言中不会。

2. 修饰指针

int * const p ;表示指针变量本身不能被修改,只能指向这一个地址,这与引用比较类似,一个变量的引用,在生命周期内只能引用一个对象。但是这个指针所指向的内容是可以改变的。


const int *p这表示p所指向的空间内容不可修改。C语言中int *p = 1; 可以正常运行。因为发生了隐式类型转换会出现警告。但是C++中有严格的类型检测,不允许这样进行赋值。必须显式的给出强制转换。强行转换之后对对应地址内容进行修改,C中输出 *p与m值相同,C++中 *p是修改后的值,m则是定义时的值,因为C++中被const修饰的变量,会在编译时期进行替换。

3. 修饰函数

放在返回值前 const int add(int a, int b)无意义,因为返回的值本就是一个临时变量。所以const修饰也没有任何作用

放在参数列表前修饰。用来保护传进来的参数,保证尽可能的不被修改。

放在函数后面。用来修饰类的成员函数中的this所指向的,也就是保护类成员(非静态成员除外)不被修改。同时,没有const修饰的函数可以调用const修饰的成员函数,但是被const修饰的成员函数不可以调用非const修饰的成员函数。而且非const定义出来的对象可以调用const与非const函数,但是const定义出来的对象只能调用const修饰的函数,不能调用非const函数,因为他有可能对对象进行修改。


类成员函数中,后面加与不加const也可以形成重载。const修饰的对象调用的是const修饰函数,非const修饰的对象调用的是非const函数。

4. 修饰类成员变量

const成员变量必须在类的构造函数的初始化列表中初始化,因为此时类并没有进行实例化(创建对象),因此也没有分配内存。因为类中变量只是声明时候用的cosnt来修饰,const要修饰一个变量不能被改变,总不能这个变量都没有值,就让他不能被改变吧。所以要在这个变量被创建之前就给他定义一个值。类的构造函数的初始化列表中就可以在对象创建之前做到这一点。如果不在构造函数初始化列中给出值,有可能在构造函数体中,这个const成员已经指向了一个随机的初始值。这样就不切合实际了。


如果是static const 同时修饰的类成员变量。可以在类的内部声明时给出初始化。同时在类外(全局作用域)进行声明。否则不会为这个变量分配空间。

posted @ 2019-04-29 22:26  unique_ptr  阅读(557)  评论(0编辑  收藏  举报