07-explicit关键字

1. Level_2_title

  • explicit的作用:
    • 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生隐式类型转换,只能以显式的方式进行类型转换
    • 与他相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐藏的)
  • explicit使用注意事项:
    1. 只能用于类内部的构造函数声明上
    2. 作用于单个参数的构造函数
class MyClass { 
public: 
    MyClass(int a); 
    ~MyClass(); 
}; 

MyClass::MyClass(int a) { 
    std::cout << "constract" << std::endl; 
} 
MyClass::~MyClass() { 
    std::cout << "deconstract" << std::endl; 
} 

void fun(MyClass mc) { 
    std::cout << "fun" << std::endl; 
} 

int main(int argc, char const *argv[]) { 
    fun(5); 
    std::cout << "end" << std::endl; return 0; 
}

这段代码输出为:

constract
fun 
deconstract 
end

上面fun的参数是MyClass,而我们传入了一个整数,竟然没有报错,程序做了一件事就是拿这个整数构建了一个MyClass对象,然后fun调用完成后销毁。这个特性很方便,但是有些时候这个转换并不符合预期,比如我们还有个fun的参数是double,那么调用的就是这个参数为double的函数了,因为这个转换更直接(对于C++而言)。所以我们有时候需要对这种转换做下控制,不能隐式的转换,这个时候explicit就派上用场了,我们只需要在构造函数前面加入explicit

explicit MyClass(int a);

这样程序在编译的时候就会报错,提示不能进行类型转换,我们的目的就达到了

这个转换只能做一次,也就是说如果你的程序有另一个类Test可以接收一个MyClass的对象,fun的参数是Test,那么是无法完成的,因为这需要两次转换。也就是说C++会努力寻找离你目标最近的那个转换,且只做一次,且有优先顺序,例如int转为double就比转为MyClass更优先。


comments powered by Disqus