You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用(*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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 22:25:22