const类型参数的对象引用
在如下的类声明中:
class C{
private:
string name;
public:
C(){/*...*/} //default constructor
C(int x){/*...*/} //convert constructor
void setName(const string& n){name = n;}
};
函数setName的string类型参数n标记为const,表明setName不会改变n,只是将n赋值给数据成员name。
通常,如果一个对象通过引用方式传到函数f中,而函数f又不会通过修改对象的数据成员的值改变对象的状态,那么,最好将f的参数标记为const,可以预防对参数的误写,同时有些编译器还可以对这种情况进行一些优化。
const成员函数
如果一个成员函数不需要直接或间接(通过调用其他的成员函数来改变其对象状态)地改变该函数所述对象的任何数据成员,那么最好将这个成员函数标记为const。
在如下的类声明中:
class C{
private:
string num;
public:
C(){/*...*/} //default constructor
C(int x){/*...*/} //convert constructor
void set(int n){num = n;}
int get() const{return num;}
};
由于get成员函数不需要改变类C的任何数据成员,因此我们将get成员函数标记为const。请注意,定义一个const成员函数时,const关键字出现在参数列表与其函数体之间。
由于get成员函数不更改任何数据成员,因此我们称这种类型的函数为只读函数。将成员函数标记为const可以预防对该函数所属对象的数据成员的误写,同时有些编译器还可以对这种情况进行一些优化。
一个const成员函数仅能调用其他const成员函数,因为const成员函数不允许直接或间接地改变对象的状态,而调用非const成员函数可能会间接地改变对象的状态。