很久没有写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;