static_cast
dynamic_cast
const_cast
reinterpert_cast
类型转换构造函数
典型案例就是 string a = “abc”;//这是隐式的调用了类型转换构造函数
实际上正规写应该是string a(“abc”);
类型转换构造函数有两种情况会调用
1.发生在初始化语句 如果所用参数类型和类内部数据类型不匹配时
例如
class A
{
float a;
A(int x):a(x)
{
cout<<"调用了类型转换构造函数"<<endl;
}//这样我们写一个类型转换构造函数 就会被用上
}
int main()
{
A a(1);//调用了类型转换构造函数 编译器先创建一个A对象a,然后将1传递给转换构造函数对a变量进行初始化
A b = 1;//调用了类型转换构造函数
return 0
}
2.发生在赋值语句 定义一个类类型的变量后,对其进行赋值,但是等号右边的类型与其不匹配时
注意: 会创建一个临时对象 将这个对象赋值给原对象
class A {
public:
double x, y;
A()
{
cout << "构造函数" << endl;
}
A(int i) {//类型转换构造函数
cout << "类型转换构造函数" << endl;
x = i; y = 0;
}
A(const A& c):x(c.x),y(c.y)
{
cout << "调用了拷贝构造函数" << endl;
}
A(double i, double j) { x = i; y = j; }
~A()
{
cout << "析构了" << endl;
}
};
int main()
{
A a(7, 8);
a = 9; // 9被自动转换成一个临时A对象,然后将该对象赋值给a。这里的转换属于隐式的转换。
return 0;
}
调用类型转换构造函数的是临时A对象 并且在赋值给a之后 做了析构
并且在将临时A对象赋值给a时并不会调用拷贝构造函数
explicit
避免隐式转换 必须显式的调用构造函数
class A
{
explicit A(int x)
{
cout<<"调用了构造函数"<<endl;
}
};
int main()
{
A a = 1;//这样会报错 如果去掉explicit就可以这样调用
A a(1);//这样才行
return 0;
}