C++ 不具备继承关系的类之间的显式,隐式转换 2013-07-11 15:41

很久没有写blog了,今天在学习c#的时候看到某一章节 讲类的隐式与显式转换。特此留笔,以供后续参考之用。c#

        关于显式,隐式转换有些争论,说什么不建议隐式转换。可是我的认为非必要,若是有良好的基础书写基础,那么隐式和显式转换是没有区别的,反却是隐式转换更方便。函数

        先说显式转换 如今有类CPoint 和类CRect;把CRect 对象强制转换为CPoint类型的对象。学习

实现思路是:重载CPoint的构造函数,既重载参数为CRect类型的构造参数便可,此时explicit 无关紧要,可是我的建议有explicit关键字,有的话必须强转。这样能培养良好的书写规范。如CPoint obj = (CRect)rect;比CPoint obj = rect 的可读性要好。若是没有explicit关键字,则属于隐式转换了。spa

伪代码:explicit CPoint(const CRect& obj)这是显式强转; CPoint(const CRect& obj) 属于隐式转换的一种。我的喜欢第一种书写方式对象

把CRect 对象隐式转换为CPoint类型的对象。blog

(1) 重载CPoint的构造函数,参数为CRect类型,可是构造函数不用explicit 修饰。ci

(2)重载CPoint 的赋值函数,既重载=。 伪代码:CPoint& operator=(const CRect& obj);it

  (3)  实现普通的函数转换,函数为CPoint的成员函数或者静态函数,实现的方式多样。伪代码如:CPoint GetPointFromRect(const CRect& obj); 或者 void GetPointFromRect(CRect& obj )等。io

(4)很奇特的一种。operator除了重载符号外的另外一种用法,重载类别。 既operator CPoint(); 这种用法要在CRect类中实现对CPoint 的重载。function

注意一个小细节,在CPoint中重载构造函数其参数为CRect的,而且在CRect 实现了operator CPoint 隐式转换。在调用时优先选用CPoint的构造函数,其次再调用CRect的对CPoint的隐式转换函数。

伪代码:

CTestRect test(2,3, 20,50);

CTestPoint obj,obj3;

obj = (CTestPoint)test; // what function?

obj3 = test;

CTestPoint obj2 = test;