C++ explicit关键字用法
1.为何引入explicit关键字?
explicit关键字是用来修饰类的构造函数,表明构造函数是显示的。除了拷贝构造函数,任何单参数并且不被声明为explicit的构造函数都可以被编译器用来执行隐式转换,即构造函数接收的类型会转换成定义了该构造函数的类的对象。编译器可能在并非期望的情形中使用了隐式转换,造成编译错误。所以我们要引入explicit关键字防止这种现象的发生。
2.explicit的使用范围.
explicit关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上。
只能对用户自己定义的对象起作用,不对默认构造函数起作用,只能修饰构造函数,而且构造函数的参数只能有一个。 (如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 即explicit关键字也就无效了。但也有例外, 就是当除了第一个参数以外的其他参数都有默认值的时候,explicit关键字依然有效。当调用构造函数时只传入一个参数, 等效于只有一个参数的类构造函数。)
3.explicit的使用分析.
代码:
#include<iostream>
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"<<endl;
Test1 t1 = 12; //隐式调用其构造函数, 成功
Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
Test2 t3(12); //显示调用成功
return 0;
}
例子来源于百度百科
分析:
Test1的构造函数带一个int型的参数,代码Test1 t1 = 12;会隐式转换成调用Test1的这个构造函数。
Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,如代码Test2 t2 = 12 编译错误;代码Test2 t3(12);显示调用成功。普通构造函数能够被隐式调用;而explicit构造函数只能被显示调用。
在C++中,一个参数的构造函数 (或者除了第一个参数外其余参数都有默认值的多参构造函数),既是一个构造器还是默认且隐含的类型转换操作符。因此隐式转换会悄无声息地发生的,而在大部分情况下隐式转换违背了我们的本意,容易导致错误。使用关键词explicit可以使构造函数有明确的转换,避免了由隐式转换而出现的错误。在编程过程中合理的使用explicit关键词,会使得代码更加的严谨规范。