explicit构造函数
class IntCell
{
public:
explicit IntCell(int initialValue=0):storedValue(initialValue){}
private:
int storeValue;
};
所有的单参数的构造函数都必须是explicit的,以避免后台的类型转换。否则,一些宽松的规则将允许在没有显示类型转换操作的情况下进行类型转换。通常,这种不希望发生的行为会破坏代码的可读性,并导致难以发现的错误。
考虑以下例子:
IntCell obj;
obj=37;
在C++中,单参数构造函数定义了一个隐式类型转换,改转换创建了一个临时对象,从而使赋值变成了兼容,例如:
IntCell temporary =37;
obj=temporary;
注意,临时对象的构造也可以通过使用单参数构造函数来实现。使用explicit意味着单参数构造函数不能用来创建隐式临时对象。
常量成员函数
class IntCell
{
public:
explicit IntCell(int initialValue=0):storedValue(initialValue){};
int read() const{return storedValue};
private:
int storedValue;
};
在C++中,每个成员函数都被标识为访问函数或修改函数。在设计阶段,这是很重要的一步,不可以被简单的看成注释。例如,访问函数不能用于常量对象。默认情况下,所有成员函数都是修改函数,要使成员函数成为访问函数必须在参数类型列表结尾的圆括号后加上关键字const。
如果成员函数标记为访问函数但在实现又去改变数据成员的值,那么就会出现编译错误。