Const

:::tips

  • const修饰符修饰的变量在程序中不能被修改;
  • 可以用来修饰变量以及成员函数;
  • 声明为const的对象只能调用const修饰的成员函数(为了保证自身不被修改)
  • const修饰的成员函数表示该函数不会修改class object的内容; :::
  1. int Triangular::elem(int pos) const
  2. {
  3. return _elem[pos-1];
  4. }

const修饰符需要紧接在函数的参数列表后面;编译器不会分析每个函数决定他是const还是non-const,但是会检查每个声明为const的成员函数,确保其未改变class object内容。

重载const

声明为const的成员函数返回值(如果是class object)一般也需要声明const;
member function可以通过const来进行重载,即可以提供两份定义:一份const,另一份non-const;
为什么这样呢? :::info 如果没有const版本的,那么声明为const的对象调用改函数时,会返回一个non-const引用,这样等于间接的将对象开放了出去;定义两份函数后,const对象调用const版本,non-const对象调用non-const版本; :::

  1. class val_class{
  2. public:
  3. const BigClass& val(){return _val;}
  4. BigClass& val(){return _val;}
  5. }

Mutable Data Member

如果确实需要改变某些成员变量的值,但是还是需要const对象调用,那么可以将能够改变的成员变量声明为mutable;即表面改变这个成员变量的值不影响是否为const

小结

  • const可以修饰对象,修饰的对象不可改变其成员;
  • const对象只能调用const成员函数
  • 若是const对象希望能够改变某些成员变量,需要将成员变量声明成mutable;