本文共 1657 字,大约阅读时间需要 5 分钟。
本文将从三个方面来讨论const带来的代码健壮性:const在变量中的用法,const在函数中的用法,const作为返回值的用法。
代码示例:
int num = 1;const int a = 1; //a的值不能被改变const int *b = # //b的值不能被改变,这个指针的类型是(const int)const data,not const pointerint const *c = # //同上,c的值不能被改变,这个指针的类型是(const int)const data,not const pointerint *const d = # //d的地址不能被改变, 这个指针的类型是(const *int)const pointer, not const dataconst *int e = # //同上,e的地址不能被改变, 这个指针的类型是(const *int)const pointer,not const dataint const* const f =# //f的地址和值都不能被改变,这个指针类型是(const *int const) const pointer,const dataconst *int const g= # //同上,g的地址和值都不能被改变,这个指针类型是(const *int const) const pointer,const data
当用const修饰的时候,被修饰的变量不能被改变,可以防止编程人员对不需要改变的常量进行更改。
代码示例:
class obj{public: obj()=default; int change_a() const{ a = 5; //错误,禁止const函数修改成员变量(error: assignment of member ‘obj::a’ in read-only object) display(); //错误,禁止const函数调用非const成员函数(error: passing ‘const obj’ as ‘this’ argument discards qualifiers) } void display(){ std::cout << "HI" << std::endl; } //省略析构函数private: int a = 1; int b = 1;};
用const修饰的函数不能修改任何成员变量,不能调用任何非const成员函数。
const int func(){ return 5;}int main(){ int i = func(); const int j = func();}
这里func返回的值本身就是一个暂存在外部存储单元中的一个值,所以用const并没有意义,所以int i
和 const int j
都是可以接受这个值的。
const int *func(){ int *a = new int(5); return a;}int main(){ int *a1 = func(); // 错误,a应该是一个常量指针(const data, not const pointer) const int *a2 = func(); //正确 const *int a3 = func(); //错误, 这里是const pointer,但是值是可以改变的,要至少满足返回值的const条件 const *int const a4 = func(); //正确,这里时刻const data,满足返回值的类型 return a;}
转载地址:http://mxoli.baihongyu.com/