资讯动态

类和对象(上):一文讲透C++构造函数与析构函数:调用时机+常见坑+代码示例

发布时间:2026/9/24 15:51:04 来源:尧图企业网站定制
前言本篇以Date类和Stack类为例C为什么要引入构造函数和析构函数在C语言的结构体中如果需要初始化成员通常要自己编写一个初始化函数并在定义变量后手动调用它——这一步非常容易遗漏。C引入构造函数使得对象在创建时自动完成初始化无论对象如何定义全局、局部、动态分配构造函数都会被调用从而杜绝了忘记初始化的隐患。对于需要申请资源的类如动态内存、文件句柄等如果资源在对象存活期间被申请必须在对象销毁前释放否则会造成资源泄漏。C引入析构函数它在对象生命周期结束时自动被调用用来释放对象所拥有的资源无论资源是在构造函数还是其他成员函数中申请的。构造函数与析构函数共同支撑了资源获得即初始化机制大大提高了资源管理的安全性和便利性。构造函数的特点构造函数是特殊的成员函数在对象实例化时初始化对象。1.函数名与类名相同2.无返回值指的是真的没有返回值连void也没有3.构造函数可以重载对象在实例化时会调用对应的构造函数4.如果类中没有显式地定义了构造函数则编译器会自动生成一个没有参数的默认构造函数一旦你自己定义了一个构造函数则编译器不再生成5.默认构造函数不单单指编译器自动生成的构造函数还指我们自定义的无参构造函数和全缺省构造函数默认构造函数本质上就是指不传参数就可以被调用的构造函数class Date { public: Date(int year2026,int month5,int day18) { _yearyear; _monthmonth; _dayday; } private: int _year; int _month; int _day; }6. 对于同时包含内置类型和自定义类型成员的类如果我们不自定义任何构造函数由编译器自动生成的默认构造函数会对内置类型成员不进行初始化保留随机值除非成员有类内初始值对自定义类型成员调用它们各自的默认构造函数进行初始化。因此如果我们需要初始化内置类型成员或者希望类支持无参构造通常应该自定义构造函数并且建议同时提供默认构造函数例如typedef int STDataType; class Stack { public: Stack(int n 4) { //初始化 } //... private: STDataType* _a; size_t _capacity; size_t _top; }; // 两个Stack实现队列 class MyQueue { //... Stack pushst; Stack popst; }; int main() { MyQueue q;//编译器默认⽣成MyQueue的构造函数调⽤了Stack的构造完成了两个成员的初始化 return 0: }析构函数的特点1.析构函数名是在类名前加上字符~2.无参数无返回值与构造函数相似连void也没有3.一个类只能有一个析构函数与构造函数不同4.若用户未显式定义析构函数编译器会自动生成一个默认的析构函数在对象生命周期结束时系统会自动调用析构函数。5.对于包含自定义类型成员变量的类当对象被销毁时这些成员变量都会自动调用它们自己的析构函数——无论该类的析构函数是用户自定义的还是编译器默认生成的。6.如果类中有资源申请时一定要自定义一个析构函数否则会造成内存泄漏。7.一个局部域的多个对象C规定后定义的析构。例如class Date { Date(....) { //... } ~Date() { //... } } int main() { Date d1; Date d2; return 0 }main函数结束后调用构造函数和析构函数的顺序分别为d1、d2和d2、d1。总结构造函数与析构函数是C类管理对象生命周期和资源的核心工具。构造函数保证对象在创建时必然初始化杜绝了C语言中手动调用初始化函数容易遗漏的问题。析构函数保证对象在销毁时自动释放资源配合RAII思想从根本上避免资源泄漏一句话记住它们构造函数负责“得到”析构函数负责“归还”——C用对象的生与死自动管好每一份资源。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价