コンパイラによって自動的に生成された関数を使用したくない場合は、明示的に拒否する必要があります。

cpp では、コピー コンストラクターを定義しなくても、コンパイラが自動的にコピー コンストラクターを生成することがわかっています。たとえば、次のコードでは、定義した person クラスはコピー コンストラクターを定義していませんが、コピー コンストラクターを定義することはできます。それでも「p2=p1」を使用します。

#include<iostream>
using namespace std;

class person
{
public:
    int m_age;
    person(int age)
    {
        m_age = age;
    }
};

int main()
{
    person p1(10);
    person p2(p1);
    cout << p2.m_age << endl; // 10

}

しかし、厳密さとセキュリティのためにこれを行いたくない場合は、すべてをコピーするのではなく、すべてをコピーすることもできます。結局のところ、世界には同じ葉は 2 つありません。その場合、もちろん、コピー コンストラクターを定義できます。この動作を直接コピーすることを拒否する場合は、どうすればよいですか?

  1. 空のコピー コンストラクターを自分で定義し、プライベートにします。

#include<iostream>
using namespace std;

class person
{
public:
    int m_age;
    person(int age)
    {
        m_age = age;
    }
private:
    person(const person&);
};

int main()
{
    person p1(10);
    person p2(p1);// 编译器报错
    cout << p2.m_age << endl;

}

上記のコードでは、コピー コンストラクターを実装せずに宣言のみし、private として定義しましたが、この時点でコンパイラーがコピー操作を整理しました。

実際, 同じことがコピー等価演算子にも当てはまります. コンパイラはそれを自動的に生成します. この動作を整理するためにプライベート コピー等価演算子を宣言し, 実装しないこともできます:

#include<iostream>
using namespace std;

class person
{
public:
    int m_age;
    person(int age)
    {
        m_age = age;
    }
private:
    person(const person&);
    person& operator=(const person&);
};

int main()
{
    person p1(10);
    person p2(p1); // 编译器报错
    person p3 = p1; // 编译器报错
    cout << p2.m_age << endl;

}
  1. 基本クラスでプライベートの空のコピー コンストラクターを定義すると、サブクラスがそれを継承します。

#include<iostream>
using namespace std;

class person
{
public:
    int m_age;
    person(int age)
    {
        m_age = age;
    }
private:
    person(const person&);
    person& operator=(const person&);
};
class student :private person
{
public:
    student();
};
int main()
{
    student s1;
    student s2(s1);
    student s3 = s1;

}

上記のコードでは、基本クラスのコピー コンストラクターを宣言するだけで実装はしません。これはプライベートなので、サブクラスが基本クラスを継承できるようにするため、ユーザーはサブクラスのコピー コンストラクターを呼び出すことができません。

おすすめ

転載: blog.csdn.net/qq_55621259/article/details/129219729