explicit的基本用法:阻止隐式转换。
详细如下:
有如下Class A
在main函数中:
int main(int argc, char* argv[])
{
A a = 100; // 说明:在此处仅仅调用了类的构造函数A(int i),效果类似于A a(100),并没有调用赋值函数或拷贝构造函数
a = 50; // 说明:在此处调用了类的构造函数A(int i),产生临时对象,之后又调用了赋值函数
A a_1(a); // 说明:在此处调用了拷贝构造函数
}
(1)a = 50
编译器要首先看 = 的右侧是否为A类的对象,如果不是,那么看类A是否存在1个int型参数的构造函数,若存在并且该构造函数没有被explicit修饰,那么就调用构造函数,产生临时对象,之后再调用赋值操作。
(2)A a = 100
此处并没有像上述那样调用赋值操作之类的,困惑中......。
若上述类A的构造函数有explicit修饰,那么A a = 100,a = 50两处无法编译通过,即阻止了隐式的调用构造函数。