在一个类中我们不写的情况下编译器会默认生成6个默认成员函数在这6个中最重要的是前4个最后两个取地址重载不是很重要我们稍微了解一下即可。其次就是C11以后还会增加两个默认成员函数移动构造和移动赋值这个我们后面再讲解。默认成员函数很重要也很复杂我们要从两个方面去学习第一我们不写时编译器默认生成的函数行为是什么是否满足我们的需求。第二编译器默认生成的函数不满足我们的需求我们需要自己实现那么自己如何实现二、构造函数有同学看到这个标题就想说构造函数有什么好学的不就是给对象开辟空间吗不用学的不用学的~~。ok构造函数虽然名称叫构造但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时空间就开好了)构造函数的主要任务是对象实例化时初始化对象。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数初始化函数的功能构造函数自动调用的特点就完美的替代了Init函数。构造函数完成初始化初始化对象不是开辟空间并且构造函数是一个特殊的成员函数接下来我们来看看它到底特殊在哪里。构造函数的特点函数名和类名相同无返回值。返回值啥都不需要给也不需要写void这里不要纠结只要记得这是C的规定对象实例化是系统会自动调用对应的构造函数。构造函数可以重载。在一个类里面可能需要多种初始化方式如果类中没有显示定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显示定义构造函数编译器将不在生成无参构造函数、全缺省构造函数、我们不写构造是编译器默认生成的构造函数都叫做默认构造函数但是这三个函数有且只有一个存在不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造实际上无参构造函数、全缺省构造函数也是默认构造总结⼀下就是不传实参就可以调用的构造就叫默认构造。我们不写编译器默认生成的构造对内置类型成员变量的初始化没有要求也就是说是否初始化是不确定的要看编译器。对于自定义类型成员变量要求调用这个成员变量的默认构造函数初始化。如果这个成员变量没有默认构造函数那么就会报错我们要初始化这个成员变量需要用初始化列表才能解决初始化列表我们下个章节再细细讲解。ok我们先看构造函数的前四个特点通过上面的四点我们就可以写出一个构造函数了代码语言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; d1.Print(); Date d2(2025,8,4); d2.Print(); return 0; }有同学看到上面的代码就在想怎么给出了两个函数名都是Date的函数这是因为构造函数是可以重载的构造函数的函数名可以相同但是参数不相同编译器会根据参数匹配相应的函数。这时候又有其他的小伙伴看到Date d2(2025,8,4);这个构造函数在传参并且有括号就在想要不要给Date d1;的后面加个括号呢 其实这里是不需要的原因如下注意当构造函数有形参时加上括号没有参数不需要加上括号那这时候就会有同学要问了那构造函数与我们之前写的Init函数的区别是什么为什么不想要Init函数Init函数是分离的也就是对象的定义和初始化是分离的先定义后初始化这就会导致忘记初始化C这个机制是为了保证对象定义实例化出来就一定初始化因为对象实例化时会自动调用对应的构造函数也就意味着只要写了正确的构造函数对象实例化出来一定