lin53 发表于 2021-6-26 12:47:40

C++之副本构造器

基类:
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 ,这是又是为什么

lhgzbxhz 发表于 2021-6-27 10:27:55

你是如何调用的?把调用代码发上来

lin53 发表于 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();
页: [1]
查看完整版本: C++之副本构造器