C++ 构造函数AND析构函数

(一)构造函数

(1)定义

  • 构造函数是一种特殊的成员函数,在创建对象时自动调用。

  • 构造函数的名称必须与类名完全相同。

  • 构造函数没有返回类型,连void也不允许。

  • 如果没有定义构造函数编译器会生成一个默认的无参构造函数。

      无参构造函数 类名()
      有参构造函数 类名(参数 1 , 参数 2 ...)
    

(2)功能

  • 初始化对象 构造函数的主要功能是初始化对象的数据成员。这可以通过在构造函数的参数列表中传递初始值,或者在函数体内部设置默认值来实现。
  • 分配资源 在某些情况下,构造函数可能需要为对象分配资源,如动态内存、文件句柄、网络连接等。这些资源在对象生命周期内被对象使用,并在析构函数中释放。

(2)调用时机

  • 构造函数在对象实例化时自动调用,与new运算符一起使用。
  • 数组对象会根据数组中元素的个数去完成相应数量构造函数的调用。
  • 示例代码:
  1. 栈区
    先实例化对象的先调用构造函数 先实例化对象的后调用析构函数 类似数据结构中的 “栈” - 先进后出
#include <iostream>
#include <string>

using namespace std;

class demo
{
private:
    int num;
    
public:
    demo(int num) // 系统自动调用
    {
        this->num = num;
        cout << "我是无参构造函数 " << num << endl;
    }
    ~demo() // 系统自动调用
    {
        cout << "我是析构函数 " << num << endl;
    }
};

int main(int argc, char const *argv[])
{
    // 栈区 
        // 先构造的后析构
    demo d_1(1);
    demo d_2(2);
    demo d_3(3);

    return 0;
}
/*
我是无参构造函数 1
我是无参构造函数 2
我是无参构造函数 3
我是析构函数 3
我是析构函数 2
我是析构函数 1
*/
  1. 堆区
    先使用new实例化对象的先调用构造函数 先用 delete 释放动态空间的先调用析构函数
#include <iostream>
#include <string>

using namespace std;

class demo
{
private:
    int num;
    
public:
    demo(int num) // 系统自动调用
    {
        this->num = num;
        cout << "我是无参构造函数 " << num << endl;
    }
    ~demo() // 系统自动调用
    {
        cout << "我是析构函数" << num << endl;
    }
};


int main(int argc, char const *argv[])
{
    // 堆区
        // 先释放的先析构
    demo *p_1 = new demo(1);
    demo *p_2 = new demo(2);
    demo *p_3 = new demo(3);

    delete p_2;
    delete p_1;
    delete p_3;

    return 0;
}
/*
输出结果:
我是无参构造函数 1
我是无参构造函数 2
我是无参构造函数 3
我是析构函数2
我是析构函数1
我是析构函数3
*/

(3)构造函数重载

  • 重载的构造函数名称都相同即都是类名。
  • 重载的构造函数具有唯一的参数列表,可以是参数的数量不同、参数的类型不同,或者参数的顺序不同。
  • 注意 函数的重载不能有二义性。
  • 示例代码:
#include <iostream>
#include <string>

using namespace std;

class demo
{
private:
    int num;
public:
    demo()
    {
        cout << "无参构造函数" << endl;
    }

    demo(int num)
    {
        this->num = num;
        cout << "有参构造函数 " << num << endl;
    }
};


int main(int argc, char const *argv[])
{
    demo d_1;
    demo d_2(10);
    return 0;
}
/*
输出结果:
无参构造函数
有参构造函数 10
*/

(4)初始化列表

(5)拷贝构造函数

(二)析构函数

(1)定义

  • 析构函数是一种特殊的成员函数,它在对象的生命周期结束时被自动调用。

  • 析构函数不接受任何参数,也不返回任何值。

  • 析构函数的名称与类名相同,但前面有一个波浪号(~)作为前缀。

      析构函数 ~类名()
    

(2)功能

  • 析构函数的主要功能是释放对象在生存期间可能分配或占用的资源,如内存、文件句柄、网络连接等。

待写…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值