mengyuyiran 发表于 2015-6-17 16:12:17

哪位大神帮看一下这个程序拿错

#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;
}

牡丹花下死做鬼 发表于 2015-6-17 16:25:16

我只能O(∩_∩)O~一笑

mengyuyiran 发表于 2015-6-17 17:07:44

牡丹花下死做鬼 发表于 2015-6-17 16:25
我只能O(∩_∩)O~一笑

:sad

mengyuyiran 发表于 2015-6-18 09:30:58

mengyuyiran 发表于 2015-6-17 17:07


求指导啊

mengyuyiran 发表于 2015-6-18 09:32:48

牡丹花下死做鬼 发表于 2015-6-17 16:25
我只能O(∩_∩)O~一笑

大神,求指导啊

仰望天上的光 发表于 2015-6-19 14:04:40

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]
查看完整版本: 哪位大神帮看一下这个程序拿错