题解 | #浅拷贝和深拷贝#
浅拷贝和深拷贝
https://www.nowcoder.com/practice/535753110cbd4e8987adc2e67f392ab7
/*描述
现有一个 Person 类,成员变量:姓名(string name)和年龄(int age),请给 Person 添加一个拷贝构造函数,让程序能够正确运行。
输入描述:
键盘输入用户名和年龄
输出描述:
通过 Person 类的showPerson()成员方法输出 Person 对象的姓名和年龄,中间使用空格隔开*/
#include <iostream>
#include <cstring>
#pragma warning(disable : 4996)
using namespace std;
class Person {
public:
char* name; // 姓名
int age; // 年龄
Person(const char* name, int age) {
this->name = new char[strlen(name) + 1];//strlen是一个计数器,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0');指针name指向 char类型、大小为strlen(name) + 1的数组 的首地址.
strcpy(this->name, name);//strcpy,即string copy(字符串复制)的缩写。strcpy是C++语言的一个标准函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*;
this->age = age;
}
Person(const Person &p) //将拷贝构造函数注释,编译器提供简单的浅拷贝 浅拷贝的简单赋值操作使程序出现堆区内存重复释放问题—— > 运行出错
{
this->age = p.age;//编译器默认代码---简单赋值
this->name = new char[strlen(p.name) + 1];
strcpy(this->name, p.name);
//开辟一个新的堆区 存放 拷贝的数据 并将新地址赋值给指针name;
}// write your code here......
void showPerson() {
cout << name << " " << age << endl;
}
~Person() {
if (name != nullptr) {
delete[] name;
name = nullptr;
}
}
};
int main() {
char name[100] = { 0 };
int age;
cin >> name;
cin >> age;
Person p1(name, age);
Person p2 = p1;
p2.showPerson();
return 0;
}
查看3道真题和解析