鱼C论坛

 找回密码
 立即注册
查看: 2919|回复: 2

C++之副本构造器

[复制链接]
发表于 2021-6-26 12:47:40 | 显示全部楼层 |阅读模式

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

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

x
基类:
class Obj
{
public:
        Obj(int *p,string name);
        ~Obj();
        //Obj operator =(const Obj& rhs);
        void printObj();
        int* ptr;
        string name;
};
Obj::Obj(int *p,string n)
{
        ptr = p;
        name = n;
}
Obj::~Obj()
{
        cout << "this name: " << name << endl; //打印obj名称
        delete ptr;
}
void Obj::printObj()
{
        cout <<name << ": "<< *this->ptr << endl;
}
运行之后:
delete这里报错,
为什么先delete obj 的名字为obj2,按道理先delete obj1的话,由于名字已经修改为obj1了,应该是this name: obj1的
第二次 delete ,结果是 this name : obj1 ,这是又是为什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-27 10:27:55 | 显示全部楼层
你是如何调用的?把调用代码发上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-10 12:19:42 | 显示全部楼层
已经解决了,下面是我的结论,看看有没有错的,当时的调用被我改了,所以哈哈哈哈
//副本构造器
        //1.产生原因: 进行 = 类拷贝时,如果类中有指针,逐行拷贝会把指针指向同一个地址,
        //留下隐患(用类2区修改类1指针的值)
        //2.解决方法: 使用赋值操作符重载,修改指针拷贝方式
        Obj obj1(new int(1),"obj1");
        Obj obj2(new int(2),"obj2");
        cout << "原本的" << endl;
        obj1.printObj();
        obj2.printObj();
        //正常delete 情况是: 先obj2 后 obj1

        //拷贝过后打印
        cout << "把obj2 拷贝给obj1 之后" << endl;
        //拷贝之后会调用obj1的析构函数,原因是,没有返回值没有引用,
        //返回的对象作为临时对象重新拷贝给obj1,作为形参,调用的是默认拷贝函数,导致调用其析构函数,吧prt delete 就出现了乱码
        //当形参为一个引用的时候,实参也对象,这时候系统会将形参指向实参,不是临时的,此时系统就不会对形参调用构造函数和析构函数!
        obj1 = obj2;
        obj1.printObj();
        obj2.printObj();

        cout << "把修改obj2的ptr 值,obj1.name修改值 之后" << endl;
        //*obj2.ptr = 5; //修改其值: obj1不变,obj2为5
        //obj1.name = "obj1"; //拷贝之后名字也变为obj2
        obj1.printObj();
        obj2.printObj();
        //过后就在delete ptr时报错,
        //原因:先delete obj2 ptr ,后delete obj ptr的地址指向obj2 已被清除 ptr ,地址为空,报错
        //解决方法是:使用赋值运算符重载

        //对象作为另个对象初始化  
        Obj obj3(new int(3),"obj3");
        Obj obj4 = obj3; //先去重载,再去调用副本拷贝函数
        Obj obj5(obj3); //先去重载,再去调用副本拷贝函数
        obj3.printObj();
        obj4.printObj();
        obj5.printObj();
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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