先说说我对编译器对const处理的理解:const修饰符定义一个常量,const变量在整个程序中只有一个拷贝。编译器会跟踪所有用到这个常量的地方,一旦发现任何一个操作可能会改变这个它是常量这个属性,那么这个操作就是不合法的:
const int val =10;
int* pTemp=&val; //不合法,因为用户可能试图通过pTemp指针改变val这个常量的值,这样就改变了val是一个常量的属性
const int val =10;
int* pTemp=&val; //不合法,因为用户可能试图通过pTemp指针改变val这个常量的值,这样就改变了val是一个常量的属性
当对指针或者引用使用const修饰符的时候,根据const的位置有俩种不同的含义:
1 当const在类型名前,表示指针或者引用所指向的值不能通过间接引用指针或者通过引用来改变
const int val = 10;
const int *constp = &var; //OK.但是*constp不能作为赋值运算的右操作数出现
int* ptemp = constp; //不合法,因为不能保证temp指针不会试图去修改它所指向的数据的值
const int &constr = var ; //OK.但是constr不能作为赋值运算的右操作数
int& rtemp = val; //不合法,因为val是常量,而rtemp不能保证不会试图修改val的值
在这里。修改变量val的值是不合法的,因为val已经声明为常量。间接的修改也是不合法的,者并不是因为val是常量,而是因为指针(或引用)变量定义为指向常量。对于指向常量的指针或者引用,间接的修改时不合法的,即使它指向一个非常量的值,例如:
int val = 10;
const int *constp =&val; //*constp任然不能作为赋值运算的右操作数出现
const int &constr = val; //constr 不能作为赋值运算的右操作数出现
2 当const在类型名后指针名之前出现,表示指针式常量,它可以被间接引用,它所指向的数据的值可以改变,但是指针所指向的地址不能改变,这类指针应该在定义时初始化,因为如果在定义时没有初始化,那么这个指针就会毫无意义,因为以后再也不能赋值了。
int val =10;
int *const constp=&val; //val变量的地址值将伴随整个constp的生命周期
*constp = 20; //合法的,constp所指的数据的值可以改变
constp=NULL //语法错误,因为指针是常量,它做指向的地址不能改变
int val =10;
int *const constp=&val; //val变量的地址值将伴随整个constp的生命周期
*constp = 20; //合法的,constp所指的数据的值可以改变
constp=NULL //语法错误,因为指针是常量,它做指向的地址不能改变
int* pTemp = constp; //合法的,都可以间接修改变量的值。
const在函数声明中的应用
const对函数的返回值以及参数的修饰作用可以参考上面的内容。
在类中声明的const成员变量,只能通过类构造函数的成员初始化列表初始化:具体可参看成员初始化列表和构造函数体类初始化的不同
const类型的类对象只能调用const成员函数
在类成员函数常见到const用在参数列表后函数体前
这种情况下 该成员函数的生命和定义中都要使用这个const;
这样的成员函数不能修改类的数据成员不能在函数中调用其它的非const成员函数
这种情况下 该成员函数的生命和定义中都要使用这个const;
这样的成员函数不能修改类的数据成员不能在函数中调用其它的非const成员函数
以上是我个人的总结,主要是我在看core c++这本书的时候笔记记下来的 还有一些后自己总结的 和大家分享
水平有限 错误在所难免 如果你发现有什么错误 请提出来 谢谢