求解,我想通过一个stu类直接申请动态空间,并赋值给p指针,后用指针箭头为被赋值的对象赋值,从而实现深复制,但是输出确实两个莫名其妙的值,不知道为什么
![](https://profile-avatar.csdnimg.cn/default.jpg!4)
关于#c++#的问题:我想通过一个stu类直接申请动态空间,并赋值给p指针,后用指针箭头为被赋值的对象赋值,但是输出确实两个莫名其妙的值
求解,我想通过一个stu类直接申请动态空间,并赋值给p指针,后用指针箭头为被赋值的对象赋值,从而实现深复制,但是输出确实两个莫名其妙的值,不知道为什么
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注
让阿豪来帮你解答,本回答参考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对象也被正确地复制了过来。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥30 电脑误删了手机的照片怎么恢复?
- ¥15 (标签-python|关键词-char)
- ¥15 python+selenium,在新增时弹出了一个输入框
- ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
- ¥20 学生成绩管理系统设计
- ¥15 来一个cc穿盾脚本开发者
- ¥15 CST2023安装报错
- ¥15 使用diffusionbert生成文字 结果是PAD和UNK怎么办
- ¥15 有人懂怎么做大模型的客服系统吗?卡住了卡住了
- ¥20 firefly-rk3399上启动卡住了