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修饰的话,编译就会出错。

 

posted @ 2015-09-12 10:50  PKICA  阅读(4)  评论(0编辑  收藏  举报