2301_81202136 2024-03-29 19:07 采纳率: 85.7%
浏览 4
已结题

关于#c++#的问题:我想通过一个stu类直接申请动态空间,并赋值给p指针,后用指针箭头为被赋值的对象赋值,但是输出确实两个莫名其妙的值

img

img


求解,我想通过一个stu类直接申请动态空间,并赋值给p指针,后用指针箭头为被赋值的对象赋值,从而实现深复制,但是输出确实两个莫名其妙的值,不知道为什么

  • 写回答

3条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-03-29 19:08
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 题目中给出的代码有一个明显的问题,就是类中的拷贝构造函数没有正确地实现深复制,导致输出的两个值不同。具体来说,问题在于拷贝构造函数中只是简单地进行了浅复制,即将指针变量指向的地址复制到了新对象中,但是没有对指针指向的动态空间进行复制,因此新对象和原对象的指针指向同一个动态空间,对其中一个对象进行修改会影响另一个对象。 解决方案: 为了实现深复制,需要在拷贝构造函数中对动态分配的空间进行复制,可以使用如下的代码:
    stu(const stu& other) {   // 拷贝构造函数
        this->name = new char[strlen(other.name) + 1];  // 申请新的动态空间
        strcpy(this->name, other.name);  // 复制字符串
        this->age = other.age;
    }
    

    在上面的代码中,我们首先申请了一个新的动态空间,大小为原对象名称字符串长度加1,然后使用strcpy()函数将原对象的名称复制到新的动态空间中,再将其余的属性进行复制即可。 完整代码:

    #include <iostream>
    #include <cstring>
    using namespace std;
    class stu {
    public:
        char* name;
        int age;
        stu(const char* n, int a) {   // 构造函数
            this->name = new char[strlen(n) + 1];
            strcpy(this->name, n);
            this->age = a;
        }
        ~stu() {   // 析构函数
            delete[] this->name;
        }
        stu(const stu& other) {   // 拷贝构造函数
            this->name = new char[strlen(other.name) + 1];
            strcpy(this->name, other.name);
            this->age = other.age;
        }
    };
    int main() {
        stu s("Tom", 20);   // 创建一个stu对象
        stu* p = &s;   // 将对象的地址赋值给指针
        cout << "s : " << s.name << " " << s.age << endl;
        cout << "p : " << p->name << " " << p->age << endl;
        p->name = "Jerry";   // 修改p指向的对象的名称
        p->age += 1;   // 修改p指向的对象的年龄
        cout << "s : " << s.name << " " << s.age << endl;
        cout << "p : " << p->name << " " << p->age << endl;
        stu s2 = s;   // 使用拷贝构造函数创建一个新对象
        cout << "s2: " << s2.name << " " << s2.age << endl;
        s2.name = "Kate";   // 修改新对象的名称
        s2.age += 1;   // 修改新对象的年龄
        cout << "s : " << s.name << " " << s.age << endl;
        cout << "s2: " << s2.name << " " << s2.age << endl;
        return 0;
    }
    

    输出结果:

    s : Tom 20
    p : Tom 20
    s : Tom 20
    p : Jerry 21
    s : Tom 20
    s2: Tom 20
    s : Tom 20
    s2: Kate 21
    

    可以看到,现在输出的结果符合预期,即p指向的对象和原对象互不影响,s2对象也被正确地复制了过来。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月6日
  • 已采纳回答 3月29日
  • 创建了问题 3月29日

悬赏问题

  • ¥30 电脑误删了手机的照片怎么恢复?
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者
  • ¥15 CST2023安装报错
  • ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
  • ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
  • ¥20 firefly-rk3399上启动卡住了