コピーコンストラクタとコピー代入演算子の自動生成を抑制する

通常コンパイラが自動生成するコピーコンストラクタと代入演算子を生成させないようにする.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)

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)