为何用(*this).ptr替代x.ptr复制字符串指针会得到不同结果?
问题解析:拷贝构造函数中
*this的身份误区 核心问题出在你对拷贝构造函数中*this的身份理解错误:拷贝构造函数里的*this指向的是正在被构造的新对象,而非用来拷贝的源对象。
两种写法的本质差异
第一种正确的浅拷贝写法
拷贝构造函数中直接使用源对象的成员x.ptr,是把源对象已初始化好的指针地址直接赋值给新对象的ptr,这才是标准的浅拷贝逻辑:class MyClass { public: int* ptr; MyClass(int val) : ptr(new int(val)) {} // 用源对象x的ptr初始化新对象的ptr MyClass(const MyClass& x) : ptr(x.ptr) {} };此时用
foo初始化bar,bar.ptr和foo.ptr指向同一块内存,地址自然相同。第二种错误写法的问题
当你写成ptr((*this).ptr)时,*this指代的是正在被创建的新对象(也就是bar),而此时这个新对象的ptr还处于未初始化状态,是一个随机的垃圾内存地址。用这个垃圾地址去初始化自身的ptr,最终得到的地址自然和源对象foo.ptr完全无关,这根本不是浅拷贝,而是错误的初始化逻辑。
关键结论
拷贝构造函数的核心是从源对象(参数中的引用)拷贝数据到新对象(*this),你需要访问的是源对象的成员,而非新对象的未初始化成员。混淆了两者的身份,才导致你的预期和实际结果不符。
内容的提问来源于stack exchange,提问作者mahmod AL-Athamnneh
相关产品推荐
相关产品推荐

