我们知道,在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
}
但是如果我们为了严谨和安全性不想这样呢,我们可能想拷贝的时候不要全部的东西全拷贝了,毕竟世界上没有两片相同的树叶,那你当然可以自己定义拷贝构造函数,但是如果你更狠直接拒绝拷贝这种行为,你该怎么办呢?
自行定义空的拷贝构造函数,并且是private的
#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的,此时编译器便组织了我们的拷贝操作。
事实上对于,拷贝等于运算符也是一样的,编译器会自动帮我们生成,我们也可以声明一个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;
}
在基类定义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&);
};
class student :private person
{
public:
student();
};
int main()
{
student s1;
student s2(s1);
student s3 = s1;
}
在上面的代码中,我们将基类的拷贝构造函数仅仅声明却没有实现,并且是private的,让子类继承基类,这样用户也不能调用子类的拷贝构造函数了!