C++中explicit关键字用法

C++ explicit关键字用法

1.为何引入explicit关键字?

explicit关键字是用来修饰类的构造函数,表明构造函数是显示的。除了拷贝构造函数,任何单参数并且不被声明为explicit的构造函数都可以被编译器用来执行隐式转换,即构造函数接收的类型会转换成定义了该构造函数的类的对象。编译器可能在并非期望的情形中使用了隐式转换,造成编译错误。所以我们要引入explicit关键字防止这种现象的发生。

2.explicit的使用范围.

explicit关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上。

只能对用户自己定义的对象起作用,不对默认构造函数起作用,只能修饰构造函数,而且构造函数的参数只能有一个。 (如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 即explicit关键字也就无效了。但也有例外, 就是当除了第一个参数以外的其他参数都有默认值的时候,explicit关键字依然有效。当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。)

3.explicit的使用分析.

代码:

#include

using namespacestd;

 

class Test1{

   public:

      Test1(int n){num = n; } //普通构造函数

   private:

      int num;

};

 

class Test2{

   public:

       explicit Test2(int n){num = n; } //explicit(显式)构造函数

   private:

      int num;

};

 

int main()

{

   cout<<"hello"<

例子来源于百度百科

分析:

        Test1的构造函数带一个int型的参数,代码Test1 t1 = 12;会隐式转换成调用Test1的这个构造函数。

        Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,如代码Test2 t2 = 12 编译错误;代码Test2 t3(12);显示调用成功。普通构造函数能够被隐式调用;而explicit构造函数只能被显示调用。

        在C++中,一个参数的构造函数 (或者除了第一个参数外其余参数都有默认值的多参构造函数),既是一个构造器还是默认且隐含的类型转换操作符。因此隐式转换会悄无声息地发生的,而在大部分情况下隐式转换违背了我们的本意,容易导致错误。使用关键词explicit可以使构造函数有明确的转换,避免了由隐式转换而出现的错误。在编程过程中合理的使用explicit关键词,会使得代码更加的严谨规范。

你可能感兴趣的:(C++)