演算子のオーバーロードを利用したコピー禁止のオブジェクト
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' の宣言を確認してください。
と、このようにコンパイルエラーになります。
いつかこのテクニックを使う日が来るかもしれませんね。具体的にどう使うのかまだ想像付きませんが。