共享数据保护
在工作中经常遇见数据被const修饰的情况,为了加深对const的熟悉程度,做个系统总结吧,有错误的地方希望轻轻地拍。
常对象
常对象:数据成员值在对象的整个生存期间内都不能被改变。
常对象必须进行初始化(因为常对象的数据不能被赋值),而且不能被更新。
const 类型说明符 对象名;
const也可放在后面,不过还是更习惯放在前面。
- 常对象的数据成员被视同为常量,这时语法会限制不能赋值。
- 不能通过常对象对用普通的成员函数。
上面这两条限制确保常对象的值不被改变。
用const修饰的类成员
常成员函数
使用const关键字修饰的函数为常成员函数,格式如:
类型说明符 函数名(参数表)const
-
函数的定义部分也要带const关键字。
-
常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有const修饰的成员函数。
-
const关键字可以用于对重载函数的区分。如
void print(); void print() const;建议:对于无需改变对象状态的成员函数,即只读接口函数,应当使用const修饰。
常数据成员
使用const说明的数据成员为常数据成员。
- 类的任何函数中都不能对该成员赋值
- 构造函数对该成员进行初始化,就只能通过初始化列表。
常引用
声明引用时用const修饰,被声明的引用就是常引用。
常引用所有引用的对象不能被更新。
格式:
const 类型说明符 & 引用名
一个常引用,无论绑定到一个普通的对象,还是常对象,通过该引用访问该对象时,都只能把该对象当作常对象。
建议:对于在函数中无需改变其值的参数,不宜使用普通引用方式加以传递,因为那会使的常对象无法被传入,采用传值方式或传递常引用的方式可避免这一问题。对于大对象来说,传值耗时较多,因此传递常引用为宜。
const与指针
const float pi = 3.14; // 常量化变量
先看到指针就是指针 先看到常量就是常量
- 常量指针 指向的内存不能通过这个指针修改
const int* p;
int const *p;
char *strcpy(char *restrict dest, const char *src); // src是源字符串 不应该被修改
- 指针常量 指向的位置不能变 可以通过这个指针修改内存的值
int *const p;
const int *const p;