当一个构造函数只有一个参数,而且该参数又不是本类的const引用时,这种构造函数称为转换构造函数,例如,
class Box {
public:
Box(int val) {
cout << "转换构造函数";
}
};
转换构造函数常发生在隐式调用 一个构造函数接收一个不同于其类类型的形参,可以视为将其形参转换成类的一个对象,例如,
int main()
{
Box a = 23;
Box b(23);
return 0;
}
输出:
转换构造函数
转换构造函数
以上两种方法都调用了相同的转换构造函数,若没有定义该构造函数,将会报错。但Box a = 23; 这种方法并不推荐。
再比如
void fun(Box box);
fun(5);
class Box {
public:
int val;
Box(int i) {
val = i;
cout << "调用转换构造函数"<<endl;
}
int getVal() {
return val;
}
};
void func(Box val)
{
Box b = val;
cout<<b.getVal()<<endl;
}
int main()
{
func(5);
return 0;
}
输出:
调用转换构造函数
5
这样调用是没有问题的,隐式类型转换会把1转换成Box的对象。 同样地
Box func(int val)
{
return val;
}
class Box {
public:
int val;
Box(int i) {
val = i;
cout << "调用转换构造函数"<<endl;
}
int getVal() {
return val;
}
};
Box func(int val)
{
return val;
}
int main()
{
Box b = func(5);
cout <<b.getVal()<<endl;
return 0;
}
输出:
调用转换构造函数
5
为了防止类似Box a=23 的隐式调用,可以使用explicit 关键字
class Box
{
public:
explicit Box(int val);
};
Box box = 1;
Box box(2);
转换构造函数常发生在隐式调用,因此也就有了explicit关键字
|