哪位大神帮看一下这个程序拿错
#include <iostream>#include <string>
using namespace std;
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<<"进入主构造器"<<endl;
ptr=p;
cout<<"离开主构造器"<<endl;
}
Myclass::Myclass(const Myclass &rhs)
{
cout<<"进入副构造器"<<endl;
*this=rhs;
cout<<"离开副构造器"<<endl;
}
Myclass::~Myclass()
{
cout<<"进入析构器"<<endl;
delete ptr;
cout<<"离开析构造器"<<endl;
}
Myclass &Myclass::operator=(const Myclass &rhs)
{
cout<<"进入赋值语句重载!"<<endl;
if(this!=&rhs)
{
delete ptr;
ptr=new int;
*ptr=*rhs.ptr;
}
else
{
cout<<"赋值号两边一样,不需要进行处理!"<<endl;
}
cout<<"离开赋值语句重载!"<<endl;
return *this;
}
voidMyclass::print()
{
cout<<*ptr<<endl;
}
int main()
{
Myclass obj1(new int(1));
Myclass obj2(new int(2));
obj2=obj1;
obj1.print();
obj2.print();
cout<<"....................................."<<endl;
Myclass obj3(new int(3));
Myclass obj4=obj3;
obj3.print();
obj4.print();
cout<<"....................................."<<endl;
Myclass obj5(new int(5));
obj5=obj5;
obj5.print();
return 0;
}
我只能O(∩_∩)O~一笑 牡丹花下死做鬼 发表于 2015-6-17 16:25
我只能O(∩_∩)O~一笑
:sad mengyuyiran 发表于 2015-6-17 17:07
求指导啊 牡丹花下死做鬼 发表于 2015-6-17 16:25
我只能O(∩_∩)O~一笑
大神,求指导啊 Myclass &Myclass::operator=(const Myclass &rhs)这个是赋值运算符的重载,这个实现没错,但是它执行的前提是调用该函数的对象已经被初始化过(即this->ptr有意义)。
接着,你的问题出在:
Myclass::Myclass(const Myclass &rhs)
{
cout<<"进入副构造器"<<endl;
*this=rhs;
cout<<"离开副构造器"<<endl;
}
拷贝构造函数调用了赋值运算符,此时this->rhs并未初始化,这样,赋值运算符里的 delete ptr;会报错。
简单的解决办法,是利用ptr为0时,delete ptr不会报错这一基本事实,将拷贝构造函数改为:
Myclass::Myclass(const Myclass &rhs):ptr(0)
{
cout<<"½øè븱11ÔìÆ÷"<<endl;
*this=rhs;
cout<<"àë¿a¸±11ÔìÆ÷"<<endl;
}
即增加对ptr成员的初始化列表就OK
页:
[1]