c++中explict关键字的说明和使用

先看下面这一个简单的代码吧

 1 #include <iostream>
 2 using namespace std;
 3 class my
 4 {
 5 private:
 6     int t;
 7 public:
 8     my(){};
 9     my(int i):t(i){};
10     int get()
11     {
12         return t;
13     }
14     void print(my d)
15     {
16         cout<<d.get()<<endl;
17     }
18 };
19 
20 int main()
21 {
22     my t;
23     int i=3;
24     t.print(i);
25     return 0;
26 }

main函数中t.print(i);的调用,my类里面print函数接受的数据类型的my,不是int,但这段程序仍然能够正常运行,是因为my类里面存在一个只有一个形参的构造函数。

当在一个需要my类型对象的地方(比如print函数,就需要一个my类型对象),但是如果却没有给一个my类型对象,给了一个其他类型的对象,比如int,那么这个时候就会看这个类有没有定义一个只接受一个参数的构造函数,而且这个形参必须是int,然后构造出一个my类型临时对象,再把这个临时对象给需要my类对象的地方,完成一种隐式的转换。
注意:如果这个类有一个接受一个参数的构造函数,但是这个参数的类型比如是string,这个隐式转换肯定就不会发生了,编译时会提示错误。

总之,隐式转换会发生在,本来需要一个这种类对象的时候,却给了一个其他的数据类型,而且类也恰好有一个只接受一个这种数据类型参数的构造函数,就会先调用这个构造函数生成一个临时对象,接着将这临时对象用于需要这种类对象的地方。

但是很多时候,这种隐式转换会带来很大的麻烦,因此如果自己定义的类中,有一个只接受一个参数的构造函数,除非有一个好理由允许构造函数被用于隐式类型转换,否则那么就要在这个构造函数前面加一个关键词 explicit,表明不会发生隐式转换。

posted on 2012-09-19 18:15 古月 阅读(578) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章档案

C++/C

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜