题目的主要信息:

  • 现有一个人类(Person),成员变量:姓名(string name)和年龄(int age),请给 Person 添加一个拷贝构造函数

具体做法:

初始化类有两种方式,一种叫构造函数,函数名称为类名,参数是成员变量的输入值,没有返回值,作用是输入成员变量的初始值,赋值给成员变量,这是用变量值初始化类;另一种叫拷贝构造函数,函数名称也是类名,与拷贝构造不同的是,它的参数是一个类,就是就是我们当前这个类,它的作用是用参数给的这个类的成员变量复制赋值给当前类的成员变量。

alt

本题中我们要写的就是一个拷贝构造函数,我们主要是要将给出类的实例p的变量值赋值给当前类的变量,因为两个变量都是public类型的,可以直接访问,因此我们可以直接访问到实例p的变量信息,变量age是int型,直接赋值即可,变量name是字符数组,我们参照构造函数对name赋值的过程,先求出长度,再用strcpy函数复制过来。

#include <iostream>
#include <cstring>
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;
        }

        // write your code here......
        Person(const Person& p){ //拷贝构造函数
            this->name = new char[strlen(p.name) + 1]; //设置name字符数组的长度
            strcpy(this->name, p.name); //拷贝name数组
            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;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),直接计算,常数时间
  • 空间复杂度:O(1)O(1),无额外空间