Const
:::tips
- const修饰符修饰的变量在程序中不能被修改;
- 可以用来修饰变量以及成员函数;
- 声明为const的对象只能调用const修饰的成员函数(为了保证自身不被修改)
- const修饰的成员函数表示该函数不会修改class object的内容; :::
int Triangular::elem(int pos) const
{
return _elem[pos-1];
}
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版本;
:::
class val_class{
public:
const BigClass& val(){return _val;}
BigClass& val(){return _val;}
}
Mutable Data Member
如果确实需要改变某些成员变量的值,但是还是需要const对象调用,那么可以将能够改变的成员变量声明为mutable;即表面改变这个成员变量的值不影响是否为const
小结
- const可以修饰对象,修饰的对象不可改变其成员;
- const对象只能调用const成员函数
- 若是const对象希望能够改变某些成员变量,需要将成员变量声明成mutable;