【C++】C++构造函数与析构函数

构造函数

构造函数概述

当类的实例进入其作用域,也就是建立一个对象时,就会调用构造函数。
那么,构造函数的作用是什么呢?当建立一个对象时,常常需要做某些初始化工作,例如,对数据成员赋值,设置类的属性等,而这些操作刚好在构造函数中完成。

定义:构造函数是与类同名的特殊成员函数,没有返回值(包括void)。
调用:构造函数在创建对象时自动调用,不能被显式调用。
重载:可以定义多个构造函数(构造函数重载),以支持不同的初始化方式。

默认构造函数:
不带参数的构造函数。
如果没有定义任何构造函数,编译器会自动提供一个默认构造函数。
示例:

class Point
{
public:
    Point()
    { // 默认构造函数
        x = 0;
        y = 0;
    }
    int x, y;
};

带参数的构造函数:
接受参数以初始化对象的属性。
示例:

class Point
{
public:
    Point(int xVal, int yVal)
    { // 带参数的构造函数
        x = xVal;
        y = yVal;
    }
    int x, y;
};

复制构造函数

在开发程序时可能需要保存对象的副本,以便在后面执行的过程中恢复对象的状态。那么,如何使用已经初始化的对象来生成一个一模一样的对象呢?答案是使用复制构造函数来实现。复制构造函数的参数是一个已经初始化的类对象。
使用复制构造函数,代码如下:

#include < iostream >
#include "Person.h"
using namespace std;
int main()
{
    CPerson p1(20, 30, 100);
    CPerson p2(p1);
}

程序中先使用带参数的构造函数声明对象p1,然后通过复制构造函数声明对象p2。因为p1已经是初始化完成的类对象,所以它可以作为复制构造函数的参数。

析构函数

构造函数和析构函数是类体定义中比较特殊的两个成员函数,因为它们都没有返回值,而且构造函数名标识符和类名标识符相同,析构函数名标识符就是在类名标识符的前面加上“~”符号。

构造函数主要用来在创建对象时,给对象中的一些数据成员赋值,目的就是初始化对象。析构函数是用来释放对象的,在删除对象前,用它来做一些清理工作。析构函数的功能与构造函数的功能正好相反。

#include <iostream>
#include <cstring>

class Student
{
public:
    // 默认构造函数
    Student(const char *name, int age)
    {
        // 动态分配内存并复制字符串
        this->name = new char[strlen(name) + 1];
        strcpy(this->name, name);
        this->age = age;
    }

    // 析构函数
    ~Student()
    {
        std::cout << "Destructor called for: " << name << std::endl;
        delete[] name; // 释放动态分配的内存
    }

    // 显示学生信息
    void display() const
    {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }

private:
    char *name; // 动态分配的字符串
    int age;
};

int main()
{
    {
        Student student1("Alice", 20); // 创建一个对象
        student1.display();            // 输出: Name: Alice, Age: 20
    } // student1的作用域结束,析构函数会被调用

    {
        Student student2("Bob", 22); // 创建另一个对象
        student2.display();          // 输出: Name: Bob, Age: 22
    } // student2的作用域结束,析构函数会被调用

    return 0;
}

使用析构函数的注意事项如下:
在一个类中只可能定义一个析构函数。
析构函数不能重载。
构造函数和析构函数不能使用return语句返回值。不用加上关键字void。

构造函数和析构函数的调用环境如下:
(1)自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数;当退出此模块时,会调用析构函数。
(2)全局变量在进入main()函数之前会调用构造函数,在程序终止时会调用析构函数。
(3)动态分配的对象使用new为对象分配内存时会调用构造函数;使用delete删除对象时会调用析构函数。
(4)临时变量是为了支持计算,由编译器自动产生的。在临时变量生存期的开始和结尾会调用构造函数与析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值