Guru of the Week 条款23:对象的生存期(第二部分)

GotW #23 Object Lifetimes – Part II

著者:Herb Sutter

翻译:CAT*G

[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者CAT*G在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者CAT*G对违反上述两条原则的人不负任何责任。特此声明。

Revision 1.0

 

Guru of the Week 条款23:对象的生存期(第二部分)

 

难度:6 / 10

 

(接着条款22,本期条款考虑一个经常被推荐使用的C++惯用法——它经常也是危险且错误的。)

 

[Problem]

[问题]

 

评述下面的惯用法(用常见的代码形式表达如下): 

    T& T::operator=( const T& other ) {
   
   
        if( this != &other ) {
   
   
            this->~T();
            new (this) T(other);
        }
        return *this;
    }

1.代码试图达到什么样的合法目的?修正上述代码中所有的编码缺陷。

 

2 .假如修正了所有的缺陷,这种惯用法是安全的吗?对你的回答做出解释。如果其是不安全的,程序员又该如何达到预想的目标呢?

 

(参见GotW条款22,以及October 1997 C++ Report

 

[Solution]

[解答]

 

评述下面的惯用法(用常见的代码形式表达如下):

    T& T::operator=( const T& other ) {
   
   
        if( this != &other ) {
   
   
            this->~T();
            new (this) T(other);
        }
        return *this;
}
 
[Summary][1]
[小结][1]
 

这个惯用法经常被推荐使用,且在C++标准草案中作为一个例子出现。[2]但其却具有不良的形式,而且——若要这么形容的话——恰恰是有害无益。请不要这样做。

 

1.代码试图达到什么样的合法目的?

 

这个惯用法以拷贝构造(copy construction)操作来实现拷贝赋值(copy assignment)操作。这即是说,该方法试图保证「T的拷贝构造与拷贝赋值实现的是相同的操作」,以避免程序员被迫在两个地方不必要的重复相同的代码。

 

这是一个高尚的目标。无论如何,它使编程更为简单,因为你不必把同一段代码编写两次,而且当T被改变(例如,给T增加了新的成员变量)的时候,你也不会像以前那样在更新了其中一个之后忘记更新另一个。

 

假如虚拟基类拥有数据成员,那么这个惯用法还是蛮有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值