题解 | #浅拷贝和深拷贝#
浅拷贝和深拷贝
https://www.nowcoder.com/practice/535753110cbd4e8987adc2e67f392ab7
#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]; strcpy(this->name, name); this->age = age; } Person(Person& m)//如果直接使用默认复制构造函数,将会造成name处的内存重复释放,因此需要给P2的name重新开一块内存,然后再在这块内存中填入P1数组的值 { name=new char[strlen(name) + 1];//+1是为了给空字符一个字节 //strcpy(this->name, m.name); //拷贝name数组 for(int i=0;i<strlen(name)+1;i++)//i<strlen(name)+1,这里的+1千万不可少,因为不把空字符也带进来的话,cout无法识别name是字符串数组,而只认为name只是一个字符的指针。 { name[i]=m.name[i]; } age=m.age; } // 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一段字符串,按了回车后,会自动在末尾添加空字符 cin >> age; Person p1(name, age); Person p2 = p1; p2.showPerson(); return 0; }