C++:隐式类型转换和关键字explicit

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37413035/article/details/80171580

《Inside the C++ Object Model》第二章开篇处有这样一段话:“事实上关键字explicit之所以被导入这个语言,就是为了给程序员提供一种方法,使他们能够制止“单一参数的constructor”被当做一个conversion运算符”。

conversion运算符即类型转换运算符,这是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型,一般形式为:operator type() const,其中type表示被转换成的某种类型。


隐式类型转换

《C++primer》中讲到了一个规定:“如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制”(关键字explicit出现的原因就是在C++这个规定的基础上)。

class Test
{
 public:  
     Test(int num);
}
Test obj = 10;//编译器自动将整型“隐式转换”为Test类对象
//在这种情况下,该语句等同于Test temp(10);Test obj = temp;

隐式类型转换中,编译器只会自动地执行一步类型转换(只允许一步类类型转换)。


关键字explicit

我们可以通过将构造函数声明为explicit从而抑制构造函数定义的隐式转换。

class Test
{  
 public:
       explicit Test(int num);
}
Test obj = 10;//error!

Note:

需要注意的是,关键字explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无需将这些构造函数指定为 explicit 的。

而且explicit只能在类内声明构造函数时使用,在类外部定义时不应重复。

explicit构造函数只能用于直接初始化,不能用于拷贝形式的初始化过程。




猜你喜欢

转载自blog.csdn.net/weixin_37413035/article/details/80171580