显式指定方法/构造函数是否意味着不能隐式调用它?我的意思是如果一个构造函数被指定为显式的,它不能被一些像 = 这样的操作符或像转换器构造函数这样的其他方法隐式调用吗?
在那种情况下,将方法/构造函数指定为显式是否有任何重要性?将方法/构造函数指定为显式有什么好处?
显式指定方法/构造函数是否意味着不能隐式调用它?我的意思是如果一个构造函数被指定为显式的,它不能被一些像 = 这样的操作符或像转换器构造函数这样的其他方法隐式调用吗?
在那种情况下,将方法/构造函数指定为显式是否有任何重要性?将方法/构造函数指定为显式有什么好处?
class MyClass
{
int i;
MyClass(YourClass &);
};
class YourClass
{
int y;
};
void doSomething(MyClass ref)
{
//Do something interesting over here
}
int main()
{
MyClass obj;
YourClass obj2;
doSomething(obj2);
}
在示例中,由于MyClass
未将构造函数指定为显式,因此在调用函数时将其用于隐式转换doSomething()
。如果构造函数被标记为显式,则编译器将在调用函数MyClass
时给出错误而不是隐式转换。doSomething()
所以如果你想避免这种隐式转换,那么你应该使用explicit
关键字。
补充一点:关键字explicit
只能用于构造函数,不能用于函数。虽然它可以用于具有多个参数的构造函数,但对于具有多个参数的构造函数,关键字并没有实际用途,因为编译器只能使用具有一个参数的构造函数进行隐式转换。
函数不能有明确的说明符。fnc 具有显式说明符是没有意义的。至于 ctor - 你的问题的答案是肯定的。声明 ctor 是显式的,这意味着隐式调用它是非法的。
什么时候有用?例如,在您的班级的情况下:
class X
{
X(char){/*something really cool*/}
};
稍后在您将编写的代码中:
X _1 = 'a';//this line will call conv ctor
上面这样的行经常发生程序员有不同的想法,这种转换完全是无意的。