一、隐式类型转换概念
简单点说,就是类型T1自动转换为类型T2
简单的隐式类型转换如:10原本是int类型数据,赋值给double类型的变量x后,会自动由int类型转换为double类型
double x = 10;
x是int类型数据,当赋值给double类型数据y时,x类型自动转换为double类型。编译器先创建一个double类型的临时变量,再将该临时变量赋值给double类型数据y。
int x = 10;
double y = x;
复杂的隐式类型转换如:对于单参数的构造函数,常规的初始化操作是A a1(1);隐式类型转换的操作是A a2 = 2。int型数据2转换为A类型数据,事实上是编译器先调用构造函数创建一个临时对象并初始化为2,再调用拷贝构造函数将该临时对象赋值拷贝给对象a2。
class A {
private:
int _a;
public:
A(int a)//构造函数
{
_a = a;
}
};
int main()
{
A a1(1);
A a2 = 2;
return 0;
}
注意:由于临时变量具有常性,所以当隐式类型转换遇到引用变量时,需要使用常变量(常对象)来接收。
编译器先创建临时对象const A tmp(3),再给该临时对象取别名为a3,类型为const A& a3
编译器先创建临时变量const double tmp=10.000000,再给该临时变量取别名为z
编译器先创建临时变量const double tmp=10.000000,再将该临时变量取别名为y
int x = 10;
const A& a3 = 3;
const double& z = 10;
const double& y = x;
二、C++11支持多参构造函数的隐式类型转换
C++11中,支持多参构造函数的隐式类型转换
class A {
private:
int _a;
int _b;
public:
A(int a, int b)//构造函数
:_a(a)
, _b(b)
{}
};
int main()
{
A a1 = { 1,2 };
const A& a2 = { 1,2 };
return 0;
}
三、expilcit关键字
如果不想构造函数发生隐式类型转换,可以在构造函数前加上关键字explicit
class A {
private:
int _a;
int _b;
public:
explicit A(int a, int b)//构造函数
:_a(a)
, _b(b)
{}
};