共享数据保护 const

114 阅读2分钟

共享数据保护

在工作中经常遇见数据被const修饰的情况,为了加深对const的熟悉程度,做个系统总结吧,有错误的地方希望轻轻地拍。

常对象

常对象:数据成员值在对象的整个生存期间内都不能被改变。

常对象必须进行初始化(因为常对象的数据不能被赋值),而且不能被更新。

const 类型说明符  对象名;

const也可放在后面,不过还是更习惯放在前面。

  1. 常对象的数据成员被视同为常量,这时语法会限制不能赋值。
  2. 不能通过常对象对用普通的成员函数。

上面这两条限制确保常对象的值不被改变。

用const修饰的类成员

常成员函数

使用const关键字修饰的函数为常成员函数,格式如:

类型说明符  函数名(参数表)const
  1. 函数的定义部分也要带const关键字。

  2. 常成员函数不能更新目的对象的数据成员,也不能针对目的对象调用该类中没有const修饰的成员函数。

  3. const关键字可以用于对重载函数的区分。如

    void print();
    
    void print() const;
    

    建议:对于无需改变对象状态的成员函数,即只读接口函数,应当使用const修饰。

常数据成员

使用const说明的数据成员为常数据成员。

  1. 类的任何函数中都不能对该成员赋值
  2. 构造函数对该成员进行初始化,就只能通过初始化列表。
常引用

声明引用时用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;