|
2鱼币
在小甲鱼的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;
- }
复制代码 各位请帮帮忙啊~
|
最佳答案
查看完整内容
你的 MyClass obj4 = obj3;这句话说明obj4里面的int*ptr没有申请过内存,那么当你delete ptr的时候肯定就要报错啰。
|