演算子のオーバーロードを利用したコピー禁止のオブジェクト

http://www.geocities.jp/ky_webid/cpp/language/017.html

インスタンスをコピーする手段には、代入演算の他に、コピーコンストラクタによるものもあるので、この2つを封じることができれば、コピーは禁止できます。これらを封じる方法は、両者を private にしてしまうことです。

なるほど。凄いですね。色々応用が利くというかなんというか・・・。

とりあえず実装して試してみます。

#include <iostream>

class CNum {
public:
    int m_num;
    CNum (int num);
    int getNum();

private:
    CNum (const CNum& obj);           // コピーコンストラクタ
    CNum& operator=(const CNum& obj); // =演算子のオーバーロード
};

CNum::CNum(int num) {
    this->m_num = num;
}

int CNum::getNum() {
    return this->m_num;
}


int main() {
    CNum num1(100);
    
    num1 = num1;
    CNum num2 = num1;
    
    std::cout << num1.getNum() << std::endl;
    return 0;
}
$ cl /W4 /EHsc main4.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main4.cpp
main4.cpp(28) : error C2248: 'CNum::operator =' : private メンバ (クラス 'CNum' で宣言されている) にアクセスできません。
        main4.cpp(13) : 'CNum::operator =' の宣言を確認してください。
        main4.cpp(5) : 'CNum' の宣言を確認してください。
main4.cpp(29) : error C2248: 'CNum::CNum' : private メンバ (クラス 'CNum' で宣言されている) にアクセスできません。
        main4.cpp(12) : 'CNum::CNum' の宣言を確認してください。
        main4.cpp(5) : 'CNum' の宣言を確認してください。

と、このようにコンパイルエラーになります。

いつかこのテクニックを使う日が来るかもしれませんね。具体的にどう使うのかまだ想像付きませんが。