3

多くのクラスには、代入演算子 (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;
}
4

2 に答える 2

6

いいえ。これは悪い考えです。C++ 標準では、オブジェクトの有効期間の説明でこの種のことを例として使用していますが。値型Pointの場合はそれほど悪くはありませんが、このクラスから派生する場合、この割り当ての実装により、オブジェクトの型が派生型からPoint;に変更されます。仮想関数が含まれている場合は、動作が劇的に変化します。

于 2013-04-10T17:20:38.593 に答える
3

Herb Sutter has addressed this in one of his GotW articles. I recommend that you read it. His conclusion:

The original idiom is full of pitfalls, it's often wrong, and it makes life a living hell for the authors of derived classes. I'm sometimes tempted to post the above code in the office kitchen with the caption: "Here be dragons."

From the GotW coding standards:

  • prefer writing a common private function to share code between copying and copy assignment, if necessary; never use the trick of implementing copy assignment in terms of copy construction by using an explicit destructor followed by placement new, even though this trick crops up every three months on the newsgroups (i.e., never write:

    T& T::operator=( const T& other )
    {
        if( this != &other)
        {
            this->~T();             // evil
            new (this) T( other );  // evil
        }
        return *this;
    }
    
于 2013-04-10T17:38:15.857 に答える