在小甲鱼的C++快速入门当中,[36]副本构造器那一课。为了避免“逐个复制”的问题,使用重构“=”赋值还有自己定义副本构造器的方法。仿造小甲鱼代码如下:
#include <iostream>
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)
{
std::cout << "进入主构造器\n";
ptr = p;
std::cout << "离开主构造器\n";
}
MyClass::MyClass(const MyClass &rhs)
{
std::cout << "进入副本构造器\n";
*this = rhs;
std::cout << "离开副本构造器\n";
}
MyClass::~MyClass()
{
delete ptr;
}
MyClass & MyClass::operator = (const MyClass &rhs)
{
std::cout << "进入赋值语句重载\n";
if(this != &rhs)
{
delete ptr; //必须先删除之前的内存
ptr = new int;
*ptr = *(rhs.ptr);
}
std::cout << "离开赋值语句重载\n";
return *this;
}
void MyClass::print()
{
std::cout << *ptr <<"\n";
}
int main()
{
MyClass obj3(new int(3));
MyClass obj4 = obj3;
obj3.print();
obj4.print();
std::cin.get();
return 0;
}
应该是没有问题的,但是运行总是出错,出错语句:MyClass & MyClass::operator = (const MyClass &rhs)
{
std::cout << "进入赋值语句重载\n";
if(this != &rhs)
{
delete ptr; //总是在此处出错
ptr = new int;
*ptr = *(rhs.ptr);
}
std::cout << "离开赋值语句重载\n";
return *this;
}
各位请帮帮忙啊~
|