类型转换构造函数
定义
为了实现类型的自动转换,我们设置类型转换构造函数,生成一个无名的临时对象(or 临时变量)。
当构造函数只有一个参数,且构造函数不是复制构造函数的,一般均看做转换构造函数。
性质与使用
其实在之前《C++学习笔记:构造函数——Constructor》一文中出现过的实例,可以看到类型转换构造函数的身影。
忘了的可以传送过去瞅一瞅哈~~
《C++学习笔记:构造函数——Constructor》
class Complex{
public:
double real , imag;
//类型转换构造函数
Complex(int i){
std::cout << "IntConstructor called" << std::endl;
real = i;
imag = 0;
}
Complex(double r, double i){
real = r;
imag = i;
}
};
int main(){
Complex c1(7,8);
Complex c2 = 12;//调用类型转换构造函数
c1 = 9;//调用类型转换构造函数,9被转换为一个临时的Complex对象
std::cout << c1.real <<","<< c1.imag<<std::endl;
std::cout << c2.real <<","<< c2.imag<<std::endl;
return 0 ;
}
输出结果如下图所示
在一些情况下,我们不希望参数这么“糊里糊涂的”被转化,那么这时候我们为类型转换构造函数加一个前缀,explicit,生成显式类型转换构造函数。
class Complex{
public:
double real , imag;
//类型转换构造函数
explicit Complex(int i){
std::cout << "IntConstructor called" << std::endl;
real = i;
imag = 0;
}
Complex(double r, double i){
real = r;
imag = i;
}
};
int main(){
Complex c1(7,8);
Complex c2 = 12;//error
Complex c2 = Complex(12);//调用显式类型转换构造函数
c1 = 9;//error
c1 = Complex(9);//调用类型转换构造函数,9被转换为一个临时的Complex对象
std::cout << c1.real <<","<< c1.imag<<std::endl;
std::cout << c2.real <<","<< c2.imag<<std::endl;
return 0 ;
}
在构造出一个显式类型转换构造函数之后,每次设计类型转换,则必须将类名声明出来,再不能直接以数字进行简略表示。这样来看,explicit 显然能够提高我们代码的可读性。