コピーコンストラクタとコピー代入演算子の自動生成を抑制する
通常コンパイラが自動生成するコピーコンストラクタと代入演算子を生成させないようにする.Effective C++ 6項.
// copyable.cpp #include <iostream> using namespace std; class User { public: User(){} User(const string n, const int a): name(n), age(a) {} ~User(){} void display(); private: string name; // いやまあこういう場合は普通ここをconstにしたりするかな. int age; }; void User::display() { cout << " name: " << name << endl; cout << " age: " << age << endl; } int main() { User sotarok("sotarok", 23), riaf("riaf", 21); cout << "sotarok is ..." << endl; sotarok.display(); cout << "riaf is ..." << endl; riaf.display(); riaf = sotarok; // のっとり大作戦 cout << "riaf is ..." << endl; riaf.display(); return 0; }
sotarok is ... name: sotarok age: 23 riaf is ... name: riaf age: 21 riaf is ... name: sotarok age: 23
これだと name や age をコピーできてしまう.というか,コピーコンストラクタが自動生成されてしまう.
privateメンバにコピーコンストラクタやオペレーター=を定義.
// uncopyable.cpp #include <iostream> using namespace std; class User { public: User(){}; User(const string n, const int a): name(n), age(a) {}; ~User(){}; void display(); private: string name; // いやまあこういう場合は普通ここをconstにしたりするかな. int age; User(const User&); // 宣言だけして定義はしない User& operator=(const User&); // こちらも同様 }; void User::display() { cout << " name: " << name << endl; cout << " age: " << age << endl; } int main() { User sotarok("sotarok", 23), riaf; cout << "sotarok is ..." << endl; sotarok.display(); // これができなくなる //riaf = sotarok; return 0; }
さらに,privateで継承するためのコピー禁止な基底クラスをつくってしまうと使いまわしができるとか.とかとか.
// uncopyable_extends.cpp #include <iostream> using namespace std; class Uncopyable { public: Uncopyable(){} ~Uncopyable(){} private: Uncopyable(const Uncopyable&); // 宣言だけして定義はしない Uncopyable& operator=(const Uncopyable&); // こちらも同様 }; class User: private Uncopyable { public: User(){} User(const string n, const int a): name(n), age(a) {} ~User(){} void display(); private: string name; // いやまあこういう場合は普通ここをconstにしたりするかな. int age; }; void User::display() { cout << " name: " << name << endl; cout << " age: " << age << endl; } int main() { User sotarok("sotarok", 23), riaf; cout << "sotarok is ..." << endl; sotarok.display(); // これができなくなる //riaf = sotarok; return 0; }
boostには noncopyable ってやつがあるってさ.
Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- 作者: スコット・メイヤーズ,小林健一郎
- 出版社/メーカー: ピアソン・エデュケーション
- 発売日: 2006/04/29
- メディア: 大型本
- 購入: 29人 クリック: 411回
- この商品を含むブログ (186件) を見る