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

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

        关于显式,隐式转换有些争论,说什么不建议隐式转换。但是个人认为非必要,如果有良好的基础书写基础,那么隐式和显式转换是没有区别的,反倒是隐式转换更方便。

        先说显式转换 现在有类CPoint 和类CRect;把CRect 对象强制转换为CPoint类型的对象。

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

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

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

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

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

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

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

注意一个小细节,在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;

posted @ 2019-06-09 10:21  沙漠驼铃  阅读(515)  评论(0编辑  收藏  举报