大概是我的C++基本欠好,记不得explicit是干嘛用的了,所以网上搜了下,想想照旧写下来,以免再忘,先来个例子,说明一下问题:
test.cc:
class A
{
public:
A(int a) : data(a){}
int data;
};
class B
{
public:
explicit B(int b) : data(b){}//就是这个了
int data;
};
void func_a()
{
A a = 0;
a = 1;
}
void func_b()
{
B b = 0;
b = 1;
}
int main()
{
func_a();
func_b();
return 0;
}
& gcc test.cc -o test
编译信息:
test.cc: In function 'void func_b()'
test.cc:29 error: no match 为 'operator='在 'b = 1'中
test.cc:14 B& B::operator=(const B&)
也就是说在func_b()中的语句 ‘b = 1;’ 错误,没有在类B中找到’=’的操纵符重载。而与类B沟通界说的类A中没有错误的原因就是因为类A的constructor没有声明为explicit,这就是所谓的隐式转换。
阐明一下:
A a = 0;
其实正确的写法应该是A a(0);
编译器认为这种写法是不类型的,但通过搜索,发明A中有一个没有被explicit修饰过的A(int a),可以举办隐式转换,这样的一句话酿成了
A tmp(0);
A a = tmp;//挪用默认的copy constructor
一句变两句了,所以提高效率要记得用A a(0); 而不要用A a = 0;
那么语句 a = 1; 也就相当于:
A tmp(1);
a = tmp;
这种转换不只产生于assignment,也大概产生于函数挪用,譬喻
func(A a){}
int main()
{
func(1);
}
雷同地,这个挪用func(1);也被隐式转换成了
A tmp(1);
fun(tmp);
class B的constructor被声明为了expcilit,编译器就认为你不想让编译器为你做隐式转换,所以func_b就error了。
so, explicit的浸染就是克制结构函数隐式转换。