2

次のような宣言を持つポイントクラスについて考えてみます。

// Point.h
class Point {
    public:
        Point();                           // Default constructor
        Point(const Point & p);            // Copy constructor
        Point & operator=(Point source);   // Copy assignment operator, needs implemented
        ~Point();                          // Destructor
    // ...
    private:
        double m_x;                        // X coordinate
        double m_y;                        // Y coordinate
};

宿題については、私が実装するために残しているのは、コピー代入演算子だけです。
これを行う方法の標準的な答えは、コピーアンドスワップのイディオムです。

コピー割り当てにスワップ関数を使用すると、1つの問題が解決され、別の問題が作成されます(スワップ関数の実装方法)。

スワップ機能を提供する必要はないと思いますが、とにかくスワップを実装する最善の方法がわかりません。専門にするのstd::swapですか?名前空間もテンプレートの特殊化についてもまだ知りません。

正式には、私の質問は2つあります。

  1. コピー割り当てはどのように実装する必要がありますか?スワップ機能を使用している場合、どのように実装すればよいですか?
  2. 野生では、クラスは単純に2つの数字なので、ビッグ3のメンバーを単純に記述しないのでしょうか。Pointコンパイラは操作を正しく最適に記述しますか?
4

2 に答える 2

2
  1. コピー アンド スワップがベスト プラクティスです。std::swapテンプレートに慣れていないためにオーバーライドしたくない場合は、swap_points関数またはPoint::swap(Point &other)メンバー関数を作成することもできます。

    その (メンバー) 関数の実装は非常に単純ですstd::swap。すべてのメンバーを呼び出すだけです。

  2. はい、このクラスのためにビッグ 3 を自分で実装することは、実際には学術的な課題です。

于 2012-07-15T21:58:15.360 に答える
2

Pointリソースを管理しないため、ここではナイーブが機能します。
double 値を単純にコピーしても例外はスローされないため、このコードは例外に対して安全です (つまり、自己割り当てに対して安全です)。

// Point.cpp

Point & operator=(Point source);
    m_x = source.m_x;
    m_y = source.m_y;

    return *this;
}
于 2012-07-15T21:59:59.417 に答える