C++可以通过expliicit可以防止内置类型隐式转换
没使用explicit的情况:
在一般的类的构造过程中:
#include<iostream>
using namespace std;
class A
{
public:
A(int num):x(num){}
int x;
};
int main()
{
A a(1);
cout<<a.x<<endl;
}
也可以写成:
#include<iostream>
using namespace std;
class A
{
public:
A(int num):x(num){}
int x;
};
int main()
{
A a = 1;
cout<<a.x<<endl;
}
在这个过程中完成了从int到A的隐式转换
这样会带来一定的安全隐患
使用explicit关键字后
在使用了explicit后,正常的构造过程是可以完成的:
#include<iostream>
using namespace std;
class A
{
public:
explicit A(int num) :x(num) {}
int x;
};
int main()
{
A a(1);
cout << a.x << endl;
}
是可以编译通过的
#include<iostream>
using namespace std;
class A
{
public:
explicit A(int num) :x(num) {}
int x;
};
int main()
{
A a = 1;
cout << a.x << endl;
}
编译器会报错:
可以发现这个隐式转换被禁用了