鱼C论坛

 找回密码
 立即注册
查看: 6515|回复: 5

[已解决]哪位大神帮看一下这个程序拿错

[复制链接]
发表于 2015-6-17 16:12:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


void  Myclass::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-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<<"&#189;&#248;è&#235;&#184;±11&#212;ì&#198;÷"<<endl;
        *this=rhs;
        cout<<"à&#235;&#191;a&#184;±11&#212;ì&#198;÷"<<endl;
}

即增加对ptr成员的初始化列表就OK
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-6-17 16:25:16 | 显示全部楼层
我只能O(∩_∩)O~一笑
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-17 17:07:44 | 显示全部楼层

:sad
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 09:30:58 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-6-18 09:32:48 | 显示全部楼层

大神,求指导啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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<<"&#189;&#248;è&#235;&#184;±11&#212;ì&#198;÷"<<endl;
        *this=rhs;
        cout<<"à&#235;&#191;a&#184;±11&#212;ì&#198;÷"<<endl;
}

即增加对ptr成员的初始化列表就OK
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-15 15:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表