[问题] 复制建构子避免 assign 给自己

楼主: yayax (夜夜叉)   2014-06-21 09:04:21
最近看到了一段程式码片段,如下:
CForeign::CForeign(const CForeign& Foreign)
{
if (this != &Foreign) // 请问这里是否恒成立呢?
{
...
}
}
我自己是觉得那个if没必要,因为一定会成立。
不过,其他三个人都认为那个if是会有不成立的可能性存在的。
我请他们提示我有什么情况下是不成立的呢? 他们只说了 new 的情况下或许有可能。
但是他们暂时还想不出不成立情形的程式码就是了。
所以,想请教大家的看法。谢谢唷!
注: 无特别的 operator overloading
※ 编辑: yayax (220.129.233.62), 06/21/2014 09:07:59
作者: ggBird (ggBird)   2014-06-21 09:55:00
自己assign自己就不成立了呀
作者: loveme00835 (发箍)   2014-06-21 10:02:00
placement newto 1楼: 这是建构子
作者: ggBird (ggBird)   2014-06-21 10:20:00
sorry没看清楚
作者: kwpn (ITSST)   2014-06-21 13:20:00
建构归建构, 跟assign一点关系也没有, 根本不需要check物件正在建构表示物件还不存在, 所以Foreign不可能是self
作者: loveme00835 (发箍)   2014-06-21 13:45:00
至少我知道 copy assignment 里可以先拿参数去建构 local 物件,再用 this->swap(local) 得到资源来免去检查,建构子的部分就看你 doc 怎么写囉,只要让使用者不乱用就好。
楼主: yayax (夜夜叉)   2014-06-21 18:24:00
感谢~ 我更确定自己的理解了
作者: jackylu63 (J)   2014-06-21 21:22:00
学到新东西了
作者: QQ29 (我爱阿蓉)   2014-06-22 00:48:00
若placement new这if 又不成立,逻辑上会错吧?两instance sasame this ptr?
作者: loveme00835 (发箍)   2014-06-22 01:58:00
逻辑上?参数是 reference 而不是另一个物件,所以参考回 this 我觉得蛮合理的。你可以当它存在,而且状态不变,即使它其实未初始化过。只是这种情况下就看原po怎么定义 copy ctor 完成之后 this 的状态了。

Links booklink

Contact Us: admin [ a t ] ucptt.com