题意整理。
- 给定一个Person类,包括姓名、年龄两个成员变量。
- 给Person类添加一个拷贝构造函数。
方法一(深拷贝)
1.解题思路
拷贝分为浅拷贝和深拷贝。浅拷贝只是将原对象的值拷贝给当前对象,两者指向的还是同一个地址,而深拷贝将原对象的引用拷贝到当前对象,两者指向的地址不同。
- 首先定义拷贝构造函数。
- 然后利用strcpy函数,将p的name传给当前类,并将p的age传给当前类。
图解展示:
2.代码实现
#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(const Person& p){
this->name = new char[strlen(name) + 1];
//利用strcpy函数,将p的name传给当前类
strcpy(this->name, p.name);
//将p的age传给当前类
this->age = p.age;
}
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.复杂度分析
- 时间复杂度:需要进行常数次操作,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。