explicit的使用
一个类拥有可以接受一个参数的构造函数时,可以进行隐式转换;然而这样可能导致意外的类型转换,因此C++提供了explicit关键字关闭隐式转换,当然仍可以显示转换;除非明确构造函数用于隐式转换,否则建议关闭这种特性。
#include <iostream>
using namespace std;
class A
{
public:
A(){}; //构造函数①
A(int a){}; //构造函数②
A(int a, int b){}; //构造函数③
};
class B
{
public:
B(){}; //构造函数①
explicit B(int a){}; //构造函数② 加explicit限定
B(int a, int b){}; //构造函数③
};
int main()
{
A aa; //调用A构造函数①
aa = 4; //隐式转换,正确
aa = (A)4; //正确,显示转换(显示强制类型转换)
B bb; //调用B构造函数①
bb = 5; //错误,被限定,无法隐式转换
bb = (B)5; //正确,显示转换(显示强制类型转换)
return 0;
}
**类拥必须有可以接受一个参数的构造函数时才能进行隐式转换,如A、B类的构造函数②,若构造函数③中第二个参数有默认参数,则是能接受一个或两个参数的构造函数。
隐式转换过程:程序使用构造函数 A(int a) 创建临时的A对象,并将4作为参数传入a,然后将该临时对象成员依次赋值给aa中。
隐式转换三种情况:
#include <iostream>
using namespace std;
class A
{
public:
A(){}; //构造函数①
A(int a){}; //构造函数②
};
void fun(A a)
{
}
int main()
{
fun(4); //①值传递fun函数接受A类型
A aa = 4; //②初始化A对象
A aa2;
aa2 = 4; //③赋值给A对象
return 0;
}