繁体   English   中英

这样的任务在C ++中是个好主意

[英]Is such assignment a good idea in C++

很多类的赋值运算符(operator =)与析构函数中的代码相同,而且复制构造函数的代码非常相似。

那么以这种方式实现作业是否是个好主意?

Point& operator=(const Point& point)
{
    if(&point != this)
    {
        //Call the destructor
        this->~Point();

        //Make the placement new
        //Assignment is made because some compilers optimise such code as just
        //  new Point;
        Point* p_n = new (this) Point(point);

        //We where placing in this place so pointers should be equal
        assert(p_n == this);
    }
    return *this;
}

不。这是一个坏主意,尽管C ++标准在讨论对象生存期时使用这种东西作为例子。 对于像Point这样的值类型,它并不是那么糟糕,但是如果从这个类派生,这个赋值实现会将对象的类型从派生类型更改为Point ; 如果涉及虚拟功能,您将看到行为的巨大变化。

Herb Sutter他的一篇GotW文章中提到了这一点。 我建议你阅读它。 他的结论是:

最初的成语充满了陷阱,它经常是错误的,它使得派生阶级的作者的生活变得生动起来。 我有时会想把上面的代码贴在办公室的厨房里,标题是:“这里有龙。”

从GotW编码标准:

  • 如果需要,更喜欢编写一个共同的私有函数来在复制和复制分配之间共享代码; 从来没有使用在复制构造方面实现复制赋值的技巧,使用显式析构函数,然后使用placement new,即使这个技巧每三个月在新闻组上出现(即,永远不会写:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM