NDK C++ 构造函数与拷贝构造函数

本文介绍了C++中类的构造函数、拷贝构造函数以及析构函数的概念和使用。通过示例代码展示了如何定义和调用这些函数,包括无参构造、带参构造、自定义拷贝构造以及析构函数在内存管理中的作用。同时,解释了栈内存和堆内存的区别,以及在对象赋值和指针操作中拷贝构造函数的运用情况。
摘要由CSDN通过智能技术生成

构造函数与拷贝构造函数

Person.h

#include <iostream>

using namespace std;

class Person {

// TODO 构造函数
public:

    Person() {
        cout << "无参构造函数" << endl;
    }

    Person(char *name) : Person(name, 18) {
        cout << "1个参数构造函数" << endl;
    }

    Person(char *name, int age) : name(name), age(age) {
        cout << "2个参数构造函数" << endl;
    }

    ~Person() {
        // 析构函数 对象被回收时,在这里做释放工作
        // 执行delete Person 的时候,析构函数一定会执行
        cout << "析构函数" << endl;
        // TODO 释放堆内存等。。。
    }

    // 覆盖拷贝构造函数,当执行 对象1 = 对象2,赋值时会默认调用隐式的拷贝构造函数,将对象2成员(name和age)的值赋值给 对象1成员(name和age)
    Person(const Person &person) {
        // 自定义拷贝构造函数,可以自定义赋值实现逻辑
        this->name = person.name;
        this->age = person.age + 10;
        cout << "自定义拷贝构造函数" << endl;
    }

// TODO 成员属性
private:

    char *name;
    int age;

// TODO 声明函数
public:

    void setName(char *name);

    char *getName();

    void setAge(int age);

    int getAge();
};

Person.cpp

#include "Person.h"

// TODO 根据头文件 ,写实现文件;声明与实现一一对应

void Person::setName(char *name) {
    this->name = name;
}

char *Person::getName() {
    return this->name;
}

void Person::setAge(int age) {
    this->age = age;
}

int Person::getAge() {
    return this->age;
}

main函数

#include "Person.h"

// TODO 构造函数与拷贝构造函数
int main() {
    // TODO 栈空间开辟内存
    Person person1;
    person1.setName("韦小宝");
    person1.setAge(18);
    cout << "name:" << person1.getName() << ", age:" << person1.getAge() << endl;

    // TODO 堆空间开辟内存
    Person *person2 = new Person("周杰伦", 28);
    cout << "name:" << person2->getName() << ", age:" << person2->getAge() << endl;
    // 回收堆内存
    delete person2; // 调用析构函数~Person()
    person2 = NULL;

    // TODO 拷贝构造函数
    Person person3("高圆圆", 18);
    Person person4 = person3; // 调用拷贝构造函数Person(const Person &person)
    cout << "name:" << person4.getName() << ", age:" << person4.getAge() << endl;

    Person person5;
    person5 = person3; // 这样赋值是不会调用 自定义拷贝构造函数,但是会调用默认赋值
    cout << "name:" << person5.getName() << ", age:" << person5.getAge() << endl;

    Person *person6 = new Person("郭靖", 16);
    Person *person7 = person6; // 压根就不会执行拷贝构造函数(指针指向问题,和对象2=对象1 是两回事)
    // 原理:person7 = person6 表示的是 person7指向 person6指向的 new Person("郭靖",16)在堆内存的地址;
    // 当person7修改age的值,就是修改new Person("郭靖",16)堆内存的值,改为new Person("郭靖",18);
    // person6是指向 new Person("郭靖",18)堆内存地址的,所以打印age = 18
    person7->setAge(18);
    cout << "name:" << person6->getName() << ", age:" << person6->getAge() << endl;
    // 回收堆内存
    delete person7; // 调用析构函数~Person()
    person7 = NULL;

    cout << "end" << endl;

    return 0;
} // main函数弹栈 会自动释放栈空间开辟的person1、person3、person4、person5,所以会调用4次析构函数~Person()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sziitjin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值