C++构造函数与析构函数详解

构造函数

构造函数的特点

构造函数是特殊的成员函数,构造函数的作用是初始化对象

  • 函数名与类名相同
  • 无返回值
  • 对象实例化时编译器自动调用对应构造函数
  • 构造函数可以重载

默认生成的构造函数

  • 如果类中没有显式定义构造函数,C++编译会自动生成无参的默认构造函数,一旦应用显式定义编译器将不再生成,使用无参构造时不需要加括号
  • 默认生成的构造函数对内置类型(int/float/double/指针~)不做处理,自定义类型(struct/class)默认调用它的构造函数
  • 无参构造,编译器创建的构造,全缺省构造,这三个函数不能同时存在
  • 无参构造,编译器创建的构造,全缺省构造都可以认为时默认构造

C++11支持在成员变量声明的时候就给缺省值

析构函数

对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

析构函数的特点

  • 析构函数名是类名加~
  • 无参无返回值类型
  • 一个类只能有一个析构函数。若未显式定义,系统自动生成默认的析构函数。(析构函数不能重载)
  • 对象生命周期结束后,C++编译系统自动调用析构函数

析构函数一般按照函数构造相反调用顺序调用

static改变对象作用域,程序结束时,才会析构释放对象

全局对象先于局部对象构造

cpp 复制代码
#include <iostream>
#include <string>

class Member {
private:
    std::string name;
public:
    Member(const std::string& n) : name(n) {
        std::cout << "Member " << name << " 构造函数\n";
    }
    
    ~Member() {
        std::cout << "Member " << name << " 析构函数\n";
    }
};

class Container {
private:
    Member m1;
    Member m2;
    
public:
    // 成员对象按声明顺序构造:m1, m2
    Container() : m1("first"), m2("second") {
        std::cout << "Container 构造函数\n";
    }
    
    // 成员对象按声明逆序析构:m2, m1
    ~Container() {
        std::cout << "Container 析构函数\n";
    }
};

int main() {
    std::cout << "=== 创建Container对象 ===\n";
    Container obj;
    std::cout << "=== 离开main函数作用域 ===\n";
    return 0;
}
复制代码
=== 创建Container对象 ===
Member first 构造函数
Member second 构造函数
Container 构造函数
=== 离开main函数作用域 ===
Container 析构函数
Member second 析构函数
Member first 析构函数

默认生成的析构函数

  • 默认生成的析构函数,行为和构造类似,内置类型成员不做处理,自定义类型成员会去调用它的构造
  • 如果类中没有申请堆资源,析构函数可以不写,直接使用编译器生成的析构函数,有资源申请时,一定要写

拷贝构造函数

自定义类型对象拷贝时,调用一个函数,这个函数就叫拷贝构造

拷贝构造函数的特点

  • 拷贝构造函数是构造函数的一个重载
  • 拷贝构造函数的参数有且仅有一个,必是类型对象的引用

用传值方式的话编译器直接报错,因为会触发无限递归

调用拷贝构造-->先传参-->传值传参-->形成新的拷贝构造

默认生成的拷贝构造函数

若未显式定义,编译器会生成默认的拷贝构造。默认的拷贝构造对对象按内存字节拷贝,也就是值拷贝(浅拷贝)

如果类中没有涉及资源的申请,拷贝函数写不写都行,一旦涉及到资源申请,拷贝函数以一定要写,否则浅拷贝会导致两次析构函数释放同一片堆空间

为了效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能引用的尽量使用引用

相关推荐
FlightYe7 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
by209999 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble9 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长9 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall10 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊10 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
你怎么知道我是队长13 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
青少儿编程课堂13 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
雷✘14 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干14 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式