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

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

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

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


二、构造函数 核心规则

  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
相关推荐
caimouse2 分钟前
Reactos 第 4 章 对象管理 — 4.6 对象的访问控制 / 4.7 句柄的遗传和继承
开发语言·windows·架构
2301_789015623 分钟前
Linux基础开发工具一:软件包管理器、vim编辑器
linux·服务器·c语言·汇编·c++·编辑器·vim
玖玥拾5 分钟前
C/C++ 基础笔记(十)
c语言·c++
huangdong_9 分钟前
京东整店商品图片视频批量下载技术:从商品列表到自动分类
开发语言·python·音视频
Frank学习路上10 分钟前
【C++】面试:指针与引用
c++·面试
摇滚侠11 分钟前
JavaWeb 全套教程 Filter 107-111
java·开发语言·servlet
YIN_尹14 分钟前
【Linux系统编程】基础IO第一讲——系统文件IO
android·java·linux·c++
聆风吟º14 分钟前
【C标准库】深入理解C语言 atoi 函数:字符串转换为整数
c语言·开发语言·库函数·atoi
凤山老林14 分钟前
81-Java Scanner 类
java·开发语言
j_xxx404_14 分钟前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai