<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

  • 随笔 - 24
  • 文章 - 0
  • 评论 - 17
  • 引用 - 0

常用链接

留言簿(4)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

自动类型转换——操作符重载
用户自定义类(class)类型可以当作系统内建类型(build-in type)来处理,对这一点我一直很惊奇,也很迷惑,特别是在类定义、继承关系很复杂的时候,要找到来龙去脉真的很抓头。最近工作中碰到这一块的东西,顺便借这个机会澄清一些概念。

看下面代码:

 1 class CBase {
 2 public:
 3     CBase()
 4     {
 5         cout << "CBase constructor()" << endl;
 6     }
 7     virtual ~CBase()
 8     {
 9         cout << "CBase destructor()" << endl;
10     }
11     
12     operator long()
13     {
14         cout << "CBase::operator long()" << endl;
15         return 0;
16     }
17     
18     operator char()
19     {
20         cout << "CBase::operator char()" << endl;
21         return 'a';
22     }
23 }
24 ;
25 class CDerived:public CBase
26 {
27 public:
28     CDerived()
29     {
30          cout << "CDerived constructor()" << endl;
31     }
32              
33     virtual ~CDerived()
34     {
35         cout << "CDerived destructor()" << endl;
36     }
37              
38     operator long()
39     {
40         cout << "CDerived::operator long()" << endl;
41         //return CBase::operator long();
           return *((CBase *)this);//change the above code to this looks better
42     }
43              
44 };
45 
46 void main()
47 {
48     CDerived d;
49     long lTmp = d;
50     cout << "lTmp=" << lTmp << endl;
51     char cTmp = d;
52     cout << "cTmp=" << cTmp << endl;
53 
54 }


由于定义了操作符重载CDerived::operator long() 和CBase::operator long(),49行得以编译通过。同理,定义了CBase::operator char(),51行可以编译。

执行结果为:
CBase constructor()
CDerived constructor()
CDerived::operator long()
CBase::operator long()
lTmp=0
CBase::operator char()
cTmp=a
CDerived destructor()
CBase destructor()

这里涉及到的概念主要有:
1 类成员操作符重载(使得用户定义类型转换为内建类型成为可能。对于用户定义类型之间的转换,还可以通过构造函数的方式进行)
2 自动类型转换。自动类型转换发生的情况有以下几种:
函数调用时传递的实参类型与函数声明中指定的参数类型不匹配
函数返回的对象类型与函数声明中指定的返回类型不匹配
表达式中操作数的类型不一致(这正是上面例子中的情况)

有意思的是,即使不定义CBase::operator char(),上面的51行仍能通过,真得感叹编译器的聪明才智了,或许只是编译器source中多了一些的if{}else{}呢?

posted on 2009-01-16 15:51 小葱蘸酱 阅读(2031) 评论(0)  编辑 收藏 引用 所属分类: 编码点滴


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