当类被实例化时,编译器会执行隐式转换的单实参构造函数,该构造函数接受的实参类型被转换成该构造函数所属类的对象。这种转换是自动的,不需要程序员进行强制类型转换。有些情况下,隐式转换是不必要的而且容易出错。
eg:
class Array{ Array(int a=10); //单实参构造函数,会隐身转换实参类型 private: int size; int *ptr; }; Array::Array(int a){ size = (s>0)?s:10;//验证数组大小 ptr = new int[size]; for(int i=0;i < size ; i++){ ptr[i] = 0; } } int main(){ Array a1(7); output(a1); output(3);//这里就会把3转换成一个数组对象,并且初始化为3个值 } void output(const Array &arr){ cout<<arr.getSize(); }
为了防止意外的将单实参构造函数用做转换构造函数 C++提供了关键字explicit,禁止通过转换构造函数进行隐转换。声明为explicit的构造函数不能用于隐式转换
eg:
class Array{
explicit Array(int a =10);
};
值得注意的是关键字explicit只能用于数据成员或单个实参构造函数中