题意整理。

  • 给定一个Person类,包括姓名、年龄两个成员变量。
  • 给Person类添加一个拷贝构造函数。

方法一(深拷贝)

1.解题思路

拷贝分为浅拷贝和深拷贝。浅拷贝只是将原对象的值拷贝给当前对象,两者指向的还是同一个地址,而深拷贝将原对象的引用拷贝到当前对象,两者指向的地址不同。

  • 首先定义拷贝构造函数。
  • 然后利用strcpy函数,将p的name传给当前类,并将p的age传给当前类。

图解展示: alt

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.复杂度分析

  • 时间复杂度:需要进行常数次操作,所以时间复杂度为O(1)O(1)
  • 空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)