类中有指针变量时的拷贝
class MyClass{
public:
MyClass(int *p);
MyClass(const MyClass &rhs); //副本构造器
~MyClass();
MyClass &operator = (const MyClass &rhs);//重载赋值符
void print();
private:
int *ptr;
};
MyClass::MyClass(int *p)+
{
cout << "进入主构造器\n";
ptr = p;
cout << "离开主构造器\n";
}
MyClass::MyClass(const MyClass &rhs)
{
cout << "进入副本构造器\n";
*this = rhs; //这里的赋值已经是重载之后的赋值符
cout << "离开副本构造器\n";
}
MyClass::~MyClass()
{
cout << "进入析构器\n";
delete ptr;
cout << "离开析构器\n";
}
MyClass &MyClass::operator = (const MyClass &rhs)
{
cout << "进入赋值语句重载\n";
if(this != &rhs)
{
delete ptr;
ptr = new int;
*ptr = *rhs.ptr;
cout << "赋值号两边为不同对象,做处理!\n";
}
else
{
cout << "赋值号两边为同个对象,不做处理!\n";
}
cout << "离开赋值语句重载\n";
return *this;
}
我的问题是:类中有指针变量,且在程序中我们要用到拷贝赋值,那么类中必须存在 副本构造器和重载赋值符 两个方法吗? 是的,当一个类中存在指针变量时,如果使用默认的拷贝构造函数和赋值运算符,会出现指针指向同一块内存的问题,导致释放内存时出现错误。因此需要手动实现副本构造函数和重载赋值运算符,来确保在类的拷贝和赋值过程中正确地处理指针变量。在上述代码中,副本构造函数和重载赋值运算符都对指针变量进行了深拷贝,即重新分配内存并将指针指向新的内存地址。这样就能够确保在类的拷贝和赋值过程中,指针变量不会指向同一块内存,从而避免出现错误。
页:
[1]