具体有这六个默认构造函数都是特殊的成员函数我们所熟知的函数的特性与它们有很大不同。2. 构造函数2.1 概念构造函数是c里类的一种特殊成员函数它在创建该类的新对象时自动调用主要用于初始化对象的数据成员和分配必要的资源。构造函数的目的是为了替代 Init 函数初始化函数。凭它自动调用的特性可以很好的避免我们在写代码时忘记对对象进行初始化。2.2 特点自动调用不用传实参 显式调用需要传参名称与类名相同。无返回值也不用写void, c规定如此。接受函数重载这代表我们可以设置多个默认构造函数根据要求用来应对不同的情况。代码语言javascriptAI代码解释class Date { public: Date()//无参构造函数 { _year 1; _month 1; _day 1; } Date(int year, int month, int day)//带参构造函数 { _year year; _month month; _day day; } void Print() { cout _year 年 _month 月 _day 日 endl; } private: int _year; int _month; int _day; }; int main() { Date d1;//自动调用 Date d2(2025, 5, 8);//显式调用 d1.Print(); d2.Print(); return 0; }小点自动调用构造函数时不能加括号如下图若我要定义一个返回值类型为 Date 的函数 func你能找到它们形式的不同点吗在这里插入图片描述所以c规定不能够加括号哦若用户未显式定义构造函数那么将由c编译器自动生成一个无参的默认构造函数一旦用户显示定义编译器将不再生成。默认构造函数只包含三类无参构造函数、全缺省构造函数和由系统自动生成的一个无参默认构造函数。这三者只能存在一个它们不能同时存在。默认构造函数 ! 只有系统生成的默认构造函数–总结不用传实参就可以调用的函数就是默认构造函数。能够被自动调用的只有不用传实参的默认构造函数。其它的都是显式调用。代码语言javascriptAI代码解释class Date { public: Date()//无参构造函数 { _year 1; _month 1; _day 1; } Date(int year 1, int month 1, int day 1)//全缺省构造函数 { _year year; _month month; _day day; } void Print() { cout _year 年 _month 月 _day 日 endl; } private: int _year; int _month; int _day; }; int main() { Date d1; d1.Print(); return 0; }能被自动调用的就只有默认成员函数不用传参也就是 5 中提到的三个那么像是我们上面代码中所写的带参构造函数它就不能被自动调用即我们需要传参使用显式调用。三者只能存在一个也可以这样理解这三个默认成员函数除了第三个是因为用户不显式定义才会存在之外前两个不能同时存在的原因就是自动调用不用传参那么我们在实例化对象的时候如何知道调用的究竟是哪一个而编译器它也不知道。就会有在这里插入图片描述在这里插入图片描述我们接下来仔细研究一下由系统生成的无参的默认构造函数利用日期类和 Stack类还有 MyQueue类由栈来实现的队列来理解代码语言javascriptAI代码解释//日期类 class Date { public: private: int _year; int _month; int _day; }; //Stack类 typedef int STDataType; class Stack { public: Stack(int n 4) { STDataType* tmp (STDataType*)malloc(sizeof(STDataType) * n); if (tmp nullptr) { perror(malloc fail); exit(1); } _arr tmp; _top 0; _capacity n; } private: STDataType* _arr; int _top; int _capacity; }; //MyQueue类 class MyQueue { public: private: Stack s1; Stack s2; }; int main() { Date d; Stack stack; MyQueue myqueue; return 0; }在这里插入图片描述在这里插入图片描述我们能够发现编译器没有对d 的成员变量进行初始化这是因为编译器对内置类型初始化没有要求也就是是否初始化我们不知道具体的要看编译器。那么什么是内置类型c将类型分为内置类型基本类型和自定义类型内置类型就是语言提供的原生数据类型如int / double / long / char /指针等。自定义类型就是我们使用 class / struct 等关键字自己定义的类型。我们还能够发现跟Stack类不一样我们没有给 MyQueue 类显式定义构造函数可为什么编译器能够正常对 MyQueue 类成员变量正常初始化呢这是因为MyQueue 类的成员变量都是其他类的对象在这种时候这些成员对象的构造函数会被自动调用无参数时或者我们传递实参显式调用。那么我们什么时候需要自己写构造函数呢大多数情况下都需要我们主动显式写构造函数只有像 MyQueue 类这样成员对像的构造函数能被正常调用时3. 析构函数3.1 概念析构函数是面向对象编程中类的一个特殊成员函数用于在对象生命周期结束时自动执行资源清理工作。不是销毁而是清理对象的销毁内存回收由系统自动完成而析构函数只是在此过程之中插入一个清理步骤。构造函数的目的是为了替代 Destory 函数销毁函数。凭它自动调用的特性可以很好的避免我们在写代码时忘记对对象进行清理。3.2 特点析构函数名是在类名之前加上一个 字符 ‘~’。无参数无返回值。一个类只能存在一个析构函数。如果未显式定义系统会自动生成一个默认的析构函数。在对象生命周期结束后会自动调用析构函数。