用户自定义类(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{}呢?