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

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

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

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


二、构造函数 核心规则

  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
相关推荐
W23035765732 小时前
C++ 高并发线程池实战(二):动态缓存线程池 + 调用者运行拒绝策略完整版实现
开发语言·c++·缓存
气宇轩昂固执狂2 小时前
01-初识C语言
c语言·开发语言
t***5442 小时前
如何在 Dev-C++ 中使用 Clang 编译器
开发语言·c++
cany10002 小时前
C++ - 智能指针
开发语言·c++
我要升天!2 小时前
C语言连接 MySQL:libmysqlclient 获取方式详解
c语言·开发语言·数据库·mysql·adb
angushine2 小时前
Python常用方法
开发语言·前端·python
潜创微科技3 小时前
CH9245:双 Type‑C 转 PD 芯片方案,便携显示与拓展坞的理想选择
c语言·开发语言
Emberone3 小时前
深入理解 C++ STL string:从接口使用到底层模拟实现
c++·stl
【 】4233 小时前
pyhon相对导入
开发语言·python