用转换构造函数隐式转换
让我们将问题中的示例变得更复杂
class MyClass
{
public:
int a, b;
MyClass( int i ) {}
MyClass( const char* n, int k = 0 ) {}
MyClass( MyClass& obj ) {}
}
前两个构造函数正在转换构造函数。 第三个是副本构造函数,因此它是另一个转换构造函数。
转换构造函数可实现从参数类型到构造函数类型的隐式转换。 在这里,第一个构造函数启用从explicit到类MyClass的对象的转换。第二个构造函数启用从字符串到MyClass类的对象的转换。第三个...从MyClass类的对象到MyClass的对象转换!
要成为转换构造函数,构造函数必须具有单个参数(在第二个参数中,第二个参数具有一个默认值)并且声明时不带关键字explicit。
然后,main中的初始化可能如下所示:
int main()
{
MyClass M = 1 ;
// which is an alternative to
MyClass M = MyClass(1) ;
MyClass M = "super" ;
// which is an alternative to
MyClass M = MyClass("super", 0) ;
// or
MyClass M = MyClass("super") ;
}
显式关键字和构造函数
现在,如果我们使用explicit关键字怎么办?
class MyClass
{
public:
int a, b;
explicit MyClass( int i ) {}
}
然后,编译器将不接受
int main()
{
MyClass M = 1 ;
}
因为这是隐式转换。 相反,必须写
int main()
{
MyClass M(1) ;
MyClass M = MyClass(1) ;
MyClass* M = new MyClass(1) ;
MyClass M = (MyClass)1;
MyClass M = static_cast(1);
}
explicit关键字始终用于防止对构造函数进行隐式转换,它适用于类声明中的构造函数。