C++ でコピー コンストラクターを禁止する最も確実な方法は何ですか? 質問する

C++ でコピー コンストラクターを禁止する最も確実な方法は何ですか? 質問する

場合によっては、C++ クラスのコピー コンストラクターを禁止して、クラスを「コピー不可」にする必要があります。もちろん、operator=同時に禁止する必要があります。

これまで、これを行う方法は 2 つ見てきました。方法 1 は、メソッドをプライベートとして宣言し、実装を行わないことです。

class Class {
//useful stuff, then
private:
    Class( const Class& ); //not implemented anywhere
    void operator=( const Class& ); //not implemented anywhere
};

方法 2 は、メソッドをプライベートとして宣言し、それに「空の」実装を与えることです。

class Class {
//useful stuff, then
private:
    Class( const Class& ) {}
    void operator=( const Class& ) {}
};

私の意見としては、最初の方法の方が良いでしょう。予期しない理由でコピー コンストラクターが同じクラス メンバー関数から呼び出されたとしても、後でリンカー エラーが発生します。2 番目のケースでは、このシナリオは実行時まで気付かれません。

最初の方法には重大な欠点がありますか? 欠点があるとすれば、それよりも良い方法は何ですか? また、その理由は何ですか?

ベストアンサー1

最初の方が良い

さらに良いのはC++0x 'delete' キーワード:

class Class {
// useful stuff, then
public:
    Class(const Class&) = delete;
    void operator=(const Class&) = delete;
};

おすすめ記事