构造函数与析构函数完全指南

一、为什么需要构造函数?

普通对象创建后,成员变量是随机垃圾值,需要手动赋值,繁琐且不安全。构造函数 :对象创建时自动调用 ,专门用于初始化成员属性。析构函数 :对象销毁时自动调用,专门用于释放资源。

二者都是系统自动触发,无需手动调用。


二、构造函数 核心规则

  1. 函数名必须和类名完全相同
  2. 无返回值、不写void
  3. 对象实例化时自动执行一次
  4. 可重载、可带参数、可多个

1. 默认构造函数(无参构造)

无参数,编译器默认提供,一旦自定义构造,编译器不再生成默认构造。

复制代码
class Person
{
private:
    string name;
    int age;
public:
    // 无参构造函数
    Person()
    {
        name = "未知";
        age = 0;
        cout << "无参构造函数调用" << endl;
    }

    void show()
    {
        cout << name << " " << age << endl;
    }
};

创建对象自动执行:

复制代码
Person p; // 自动调用无参构造

2. 有参构造函数

用于创建对象时直接初始化数据,省去 set 赋值。

复制代码
Person(string n, int a)
{
    name = n;
    age = a;
    cout << "有参构造函数调用" << endl;
}

调用方式:

复制代码
Person p2("张三", 18);

3. 构造函数重载

一个类可以存在多个构造,参数个数 / 类型不同,适配不同初始化场景。

复制代码
// 无参
Person(){}
// 单参数
Person(string n){ name = n; }
// 多参数
Person(string n, int a){ name = n; age = a; }

三、拷贝构造函数

作用

已有对象,快速复制生成一个全新对象,属性完全一致。

规则

  1. 参数为本类const 引用

  2. 格式固定:类名(const 类名 &obj)

    Person(const Person &p)
    {
    this->name = p.name;
    this->age = p.age;
    cout << "拷贝构造调用" << endl;
    }

触发场景:

复制代码
Person p1("李四",20);
Person p2 = p1;  // 自动调用拷贝构造

四、析构函数 核心规则

  1. 函数名:~类名(),加波浪号

  2. 无参数、无返回值、不能重载

  3. 对象销毁时自动执行

  4. 核心用途:释放堆内存、关闭文件、清理资源

    ~Person()
    {
    cout << "析构函数调用" << endl;
    }

  • 栈对象:出作用域自动调用析构
  • 堆对象:delete 时触发析构

五、this 指针(配套必懂)

  • this 指向当前对象本身

  • 解决:成员变量与形参重名冲突

  • 格式:this->成员名

    Person(string name, int age)
    {
    this->name = name;
    this->age = age;
    }


六、完整综合代码示例

复制代码
#include <iostream>
#include <string>
using namespace std;

class Person
{
private:
    string name;
    int age;
public:
    // 无参构造
    Person()
    {
        name = "默认用户";
        age = 0;
        cout << "无参构造执行" << endl;
    }

    // 有参构造
    Person(string name, int age)
    {
        this->name = name;
        this->age = age;
        cout << "有参构造执行" << endl;
    }

    // 拷贝构造
    Person(const Person &p)
    {
        this->name = p.name;
        this->age = p.age;
        cout << "拷贝构造执行" << endl;
    }

    // 展示信息
    void showInfo()
    {
        cout << "姓名:" << name << " 年龄:" << age << endl;
    }

    // 析构函数
    ~Person()
    {
        cout << "析构函数执行,对象销毁" << endl;
    }
};

int main()
{
    Person p1;
    p1.showInfo();

    Person p2("王五", 19);
    p2.showInfo();

    Person p3 = p2;
    p3.showInfo();

    return 0;
}

七、栈对象 & 堆对象 构造析构区别

  1. 栈对象生命周期随作用域,离开大括号自动析构。

  2. 堆对象

    cpp

    运行

    复制代码
    Person *p = new Person("赵六",21);
    delete p; // 手动释放,触发析构

    不 delete → 不执行析构 → 内存泄漏。


八、高频易错点

  1. 自定义有参构造后,丢失默认无参构造,报错
  2. 构造函数写返回值、加 void,语法错误
  3. 析构函数写参数、重载,非法
  4. 拷贝构造不使用引用,引发无限递归
  5. 堆对象不 delete,资源无法释放

九、核心总结

  1. 构造函数:创建对象自动执行,负责初始化
  2. 分类:无参、有参、拷贝构造,支持重载
  3. 析构函数:销毁对象自动执行,负责资源释放
  4. this 指针:区分重名变量,代表当前对象
  5. 栈对象自动回收,堆对象必须手动 delete
相关推荐
小白学大数据8 分钟前
Python 爬虫动态 JS 渲染与无头浏览器实战选型指南
开发语言·javascript·爬虫·python
朔北之忘 Clancy11 分钟前
2026 年 3 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·青少年编程·题解·一级
佳xuan18 分钟前
模型训练之爬取数据
开发语言·python
之歆24 分钟前
DAY_10 JavaScript 深度解析:原型链 · 引用类型 · 内置对象 · 数组方法全攻略(上)
开发语言·javascript·ecmascript
zmzb010326 分钟前
Python课后习题训练记录Day122
开发语言·python
陳土35 分钟前
R语言jiebaR包使用摘要
开发语言·r语言
Evand J36 分钟前
【MATLAB】多无人机编队协同控制与三维航迹规划仿真。障碍物斥力避障,输出编队误差、控制输入、三维轨迹等
开发语言·matlab·无人机
froginwe111 小时前
jQuery UI 小部件方法调用
开发语言
信奥胡老师1 小时前
B3930 [GESP202312 五级] 烹饪问题
开发语言·数据结构·c++·学习·算法
许长安1 小时前
Redis 跳表实现详解
数据库·c++·经验分享·redis·笔记·缓存