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 つありません。その場合、もちろん、コピー コンストラクターを定義できます。この動作を直接コピーすることを拒否する場合は、どうすればよいですか?
空のコピー コンストラクターを自分で定義し、プライベートにします。
#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;
}
基本クラスでプライベートの空のコピー コンストラクターを定義すると、サブクラスがそれを継承します。
#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;
}
上記のコードでは、基本クラスのコピー コンストラクターを宣言するだけで実装はしません。これはプライベートなので、サブクラスが基本クラスを継承できるようにするため、ユーザーはサブクラスのコピー コンストラクターを呼び出すことができません。