explicit
http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html,在此感谢
C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。
explicit作用:
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。
explicit使用注意事项:
*
explicit 关键字只能用于类内部的构造函数声明上。
*
explicit 关键字作用于单个参数的构造函数。
* 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换
例子:
#include<iostream>
using namespace std;
class Test
{
private:
int a;
int b;
public:
Test(int x){
a=x;
}
int get(){
return a;
}
};
void print(Test t){
cout<<t.get()<<endl;
}
int main(){
print(100);
return 0;
}
Test类的构造函数就定义了一个从int类型到Test类型的隐式转换。
编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。
例如在上述代码中的print(100)语句中,100是int类型的数据,而print函数的参数要求是Test类型的,类型不匹配,编译器就会利用Test的构造函数进行隐式转换,将100转换为一个Test类型的实例,而后继续编译。
上述代码最终能够正确编译,
而explicit关键字是阻止单参数构造函数的这种隐式转换机制。
如果在上述的代码中的Test构造函数前面加上explicit修饰的话,编译就会出错。