余姚做网站的公司,微信公众号和网站建设,中小企业网络营销策略,久久建工集团前言 今天将步入学习类的默认成员函数#xff0c;本节讲解其中的构造函数和析构函数。 1.类的默认成员函数
在 C 中#xff0c;如果一个类没有显式定义某些成员函数#xff0c;编译器会自动为该类生成默认的成员函数。以下是编译器可能会生成的默认成员函数#xff1a;
默…前言 今天将步入学习类的默认成员函数本节讲解其中的构造函数和析构函数。 1.类的默认成员函数
在 C 中如果一个类没有显式定义某些成员函数编译器会自动为该类生成默认的成员函数。以下是编译器可能会生成的默认成员函数
默认构造函数 (Default Constructor) - 如果没有为类定义任何构造函数编译器会提供一个不带参数的默认构造函数。默认构造函数通常初始化类的成员变量为默认值例如数值类型为 0指针为 nullptr。
析构函数 (Destructor) - 如果没有为类定义析构函数编译器会提供一个默认的析构函数。默认析构函数负责释放类成员分配的资源例如动态分配的内存。
拷贝构造函数 (Copy Constructor) - 如果没有为类定义拷贝构造函数编译器会提供一个默认的拷贝构造函数。默认拷贝构造函数执行成员的逐位复制浅拷贝。
拷贝赋值运算符 (Copy Assignment Operator) - 如果没有为类定义拷贝赋值运算符编译器会提供一个默认的拷贝赋值运算符。默认的拷贝赋值运算符执行成员的逐位赋值。
移动构造函数 (Move Constructor)C11及以后 - 如果没有为类定义移动构造函数且类中至少有一个非平凡的拷贝构造函数、非平凡的拷贝赋值运算符、非平凡的析构函数或者类继承自具有非平凡移动构造函数的基类则编译器会提供一个默认的移动构造函数。
移动赋值运算符 (Move Assignment Operator)C11及以后 - 如果没有为类定义移动赋值运算符且类中至少有一个非平凡的拷贝构造函数、非平凡的拷贝赋值运算符、非平凡的析构函数或者类继承自具有非平凡移动赋值运算符的基类则编译器会提供一个默认的移动赋值运算符。 2.构造函数
2.1 构造函数的定义 在 C 中构造函数是一种特殊的成员函数用于初始化对象的数据成员。构造函数的名称必须与类名相同并且没有返回类型即使是 void 也不行。当创建类的实例时构造函数会被自动调用。构造函数的本质是要替代我们以前Stack和Date类中写的Init函数的功能构造函数⾃动调⽤的 特点就完美的替代的了Init。 2.2 构造函数的特点 1. 函数名与类名相同。 2. 无返回值。 (返回值啥都不需要给也不需要写void不要纠结C规定如此) 3. 对象实例化时系统会自动调用对应的构造函数。 4. 构造函数可以重载。 #include iostream
using namespace std;
class Date {
public:/*// 1.⽆参构造函数Date(){_year 3;_month 3;_day 3;}*//*//2.带参构造函数Date(int year, int month, int day){_year year;_month month;_day day;}*/// 3.全缺省构造函数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; // 调⽤默认构造函数Date d2(2024, 7, 21); // 调⽤带参的构造函数// 注意如果通过⽆参构造函数创建对象时对象后⾯不⽤跟括号否则编译器⽆法区分这⾥是函数声明还是实例化对象// warning C4930: “Date d3(void)”: 未调⽤原型函数(是否是有意⽤变量定义的?)Date d3(2024);d1.print();d2.print();d3.print();return 0;}其实第三个可以理解是前面两个的结合。 5. 如果类中没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器将不再生成。 6. 无参构造函数、全缺省构造函数、编译器默认生成的构造函数都叫做默认构造函数。但是这三个函数有且只有一个存在不能同时存在。无参构造函数和全缺省构造函数虽然构成函数重载但是调用时会存在歧义。要注意很多人会认为默认构造函数是编译器默认生成那个叫默认构造实际上无参构造函数、全缺省构造函数也是默认构造总结一下就是不传实参就可以调用的构造就叫默认构造。 7.编译器默认生成的构造对内置类型成员变量的初始化没有要求也就是说是是否初始化是不确定的看编译器。对于自定义类型成员变量要求调用这个成员变量的默认构造函数初始化。如果这个成员变量没有默认构造函数那么就会报错我们要初始化这个成员变量需要用初始化列表才能解决。 typedef int datatype;class Stack {
public:Stack(int n 4) {_a (datatype*)malloc(sizeof(datatype) * n);if (_a nullptr) {perror(malloc fail);return;}_top 0;_capacity n;}private:datatype* _a;int _capacity;int _top;
};
class Myqueue {
public:
private:Stack push;Stack pop;
};
int main() {Stack s1;Myqueue q1;return 0;
} 运行后 编译器默认生成MyQueue的构造函数调用了Stack的构造完成了两个成员的初始化 说明C把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型 如int/char/double/指针等自定义类型就是我们使用class/struct等关键字自己定义的类型 3.析构函数
3.1析构函数定义 在面向对象的编程语言中析构函数Destructor是一个特殊的成员函数它在对象生命周期结束时被自动调用用于执行对象销毁前的清理工作。析构函数的主要作用是释放对象在生命周期内分配的资源如动态内存、文件句柄、网络连接等。 析构函数的功能类比我们之前Stack实现的Destroy功能而像Date没有Destroy其实就是没有资源需要释放所以严格说Date是不需要析构函数的。 3.2析构函数特点 1. 析构函数名是在类名前加上字符 ~。 2. 无参数无返回值。 (这里跟构造类似也不需要加void) 3. 一个类只能有一个析构函数。若未显式定义系统会自动生成默认的析构函数。 4. 对象生命周期结束时系统会自动调用析构函数。 5. 跟构造函数类似我们不写编译器自动生成的析构函数对内置类型成员不做处理自定类型成员会调用他的析构函数。 6. 还需要注意的是我们显示写析构函数对于自定义类型成员也会调用他的析构也就是说自定义类型成员无论什么情况都会自动调用析构函数。 7. 如果类中没有申请资源时析构函数可以不写直接使用编译器生成的默认析构函数如Date如果默认生成的析构就可以用也就不需要显示写析构如MyQueue但是有资源申请时一定要自己写析构否则会造成资源泄漏如Stack。 8. 一个局部域的多个对象C规定后定义的先析构。 typedef int datatype;class Stack {
public:Stack(int n 4) {_a (datatype*)malloc(sizeof(datatype) * n);if (_a nullptr) {perror(malloc fail);return;}_top 0;_capacity n;}~Stack(){free(_a);_a nullptr;_top_capacity 0;}private:datatype* _a;int _capacity;int _top;
};
class Myqueue {
public:// 构造函数如果没有显式定义编译器会生成一个默认的构造函数Myqueue() {// 构造函数可以初始化成员对象}// 编译器默认生成的Myqueue的析构函数调用了Stack的析构释放了Stack内部的资源// 显式写析构也会自动调用Stack的析构~Myqueue() {// 函数体为空但是编译器会在这里自动调用成员对象push和pop的析构函数// 不需要显式调用push.~Stack()或pop.~Stack()编译器会自动处理}private:Stack push; // Myqueue类包含两个Stack类的成员对象Stack pop; // 当Myqueue对象被销毁时这两个成员对象也会被销毁
};int main() {Stack s1;Myqueue q1;return 0;
} 调用析构后 结束语 本节内容就到此结束下节我们将继续介绍其他的默认成员函数。 最后感谢各位友友的支持点个赞吧也欢迎大家在评论区多多交流 文章转载自: http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.lwhsp.cn.gov.cn.lwhsp.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.pdkht.cn.gov.cn.pdkht.cn http://www.morning.yzfrh.cn.gov.cn.yzfrh.cn http://www.morning.gtbjc.cn.gov.cn.gtbjc.cn http://www.morning.pjtnk.cn.gov.cn.pjtnk.cn http://www.morning.rltsx.cn.gov.cn.rltsx.cn http://www.morning.wfdlz.cn.gov.cn.wfdlz.cn http://www.morning.gkjyg.cn.gov.cn.gkjyg.cn http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn http://www.morning.rqjxc.cn.gov.cn.rqjxc.cn http://www.morning.mbrbg.cn.gov.cn.mbrbg.cn http://www.morning.wqmpd.cn.gov.cn.wqmpd.cn http://www.morning.nmymn.cn.gov.cn.nmymn.cn http://www.morning.yxplz.cn.gov.cn.yxplz.cn http://www.morning.trffl.cn.gov.cn.trffl.cn http://www.morning.txtgy.cn.gov.cn.txtgy.cn http://www.morning.fydsr.cn.gov.cn.fydsr.cn http://www.morning.dgwrz.cn.gov.cn.dgwrz.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.ymfzd.cn.gov.cn.ymfzd.cn http://www.morning.mbmh.cn.gov.cn.mbmh.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.nlmm.cn.gov.cn.nlmm.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.wkkqw.cn.gov.cn.wkkqw.cn http://www.morning.fkfyn.cn.gov.cn.fkfyn.cn http://www.morning.jynzb.cn.gov.cn.jynzb.cn http://www.morning.nmkfy.cn.gov.cn.nmkfy.cn http://www.morning.dgsr.cn.gov.cn.dgsr.cn http://www.morning.ddgl.com.cn.gov.cn.ddgl.com.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.dxtxk.cn.gov.cn.dxtxk.cn http://www.morning.srtw.cn.gov.cn.srtw.cn http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn http://www.morning.gybnk.cn.gov.cn.gybnk.cn http://www.morning.qlsbz.cn.gov.cn.qlsbz.cn http://www.morning.xmtzk.cn.gov.cn.xmtzk.cn http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.ctxt.cn.gov.cn.ctxt.cn http://www.morning.dtlnz.cn.gov.cn.dtlnz.cn http://www.morning.fykrm.cn.gov.cn.fykrm.cn http://www.morning.qpqb.cn.gov.cn.qpqb.cn http://www.morning.xhgcr.cn.gov.cn.xhgcr.cn http://www.morning.sfqtf.cn.gov.cn.sfqtf.cn http://www.morning.wpmlp.cn.gov.cn.wpmlp.cn http://www.morning.fhrt.cn.gov.cn.fhrt.cn http://www.morning.trhlb.cn.gov.cn.trhlb.cn http://www.morning.hbqhz.cn.gov.cn.hbqhz.cn http://www.morning.wchsx.cn.gov.cn.wchsx.cn http://www.morning.fgxnb.cn.gov.cn.fgxnb.cn http://www.morning.mqbsm.cn.gov.cn.mqbsm.cn http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com http://www.morning.jggr.cn.gov.cn.jggr.cn http://www.morning.snmth.cn.gov.cn.snmth.cn http://www.morning.dcdhj.cn.gov.cn.dcdhj.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.clxpp.cn.gov.cn.clxpp.cn http://www.morning.trtxt.cn.gov.cn.trtxt.cn http://www.morning.bbgn.cn.gov.cn.bbgn.cn http://www.morning.zmpsl.cn.gov.cn.zmpsl.cn http://www.morning.gxhqt.cn.gov.cn.gxhqt.cn http://www.morning.ykrg.cn.gov.cn.ykrg.cn http://www.morning.tfzjl.cn.gov.cn.tfzjl.cn http://www.morning.wyjpt.cn.gov.cn.wyjpt.cn http://www.morning.yodajy.cn.gov.cn.yodajy.cn http://www.morning.tqwcm.cn.gov.cn.tqwcm.cn http://www.morning.sjzsjsm.com.gov.cn.sjzsjsm.com http://www.morning.zpyxl.cn.gov.cn.zpyxl.cn http://www.morning.xinxianzhi005.com.gov.cn.xinxianzhi005.com http://www.morning.5-73.com.gov.cn.5-73.com http://www.morning.znrgq.cn.gov.cn.znrgq.cn http://www.morning.rbktw.cn.gov.cn.rbktw.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.gnjkn.cn.gov.cn.gnjkn.cn http://www.morning.snnwx.cn.gov.cn.snnwx.cn http://www.morning.pbdnj.cn.gov.cn.pbdnj.cn http://www.morning.nydtt.cn.gov.cn.nydtt.cn