C++构造函数&析构函数&组合类
2021/4/12 20:27:17
本文主要是介绍C++构造函数&析构函数&组合类,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++构造函数&析构函数&组合类
作用: C++在定义类的变量的时候,首先调用构造函数并且在类的变量被释放前调用析构函数。一般来讲,构造函数可以为类内成员变量来初始化,也可以对类内其他类的成员进行初始化。析构函数一般可以进行释放调用的资源。
构造函数:
在C++的类中,构造函数的名字与类的名字相同。构造函数的参数可以由这个类的变量来进行传递。构造函数还可以进行参数重载、参数默认
//class defination class stu{ public: stu(int a,int b); stu(int c); private: int age,score,gpa; } stu::stu(int a,int b){ age = a; score = b; } stu::stu(int c){ gpa = c; } //main stu a(1,3);//a.age=1,a.score=3 stu b(1);//a.gpa=1 stu c//❌
默认构造函数:
上面代码最后一行错了的原因是,c++默认如果class中没有创建构造函数,则自动帮助创建构造函数(stu::stu(){})可是这个构造函数中没有参数也没有什么作用。如果我们一旦自己创建了构造函数,那么默认的构造函数就不会帮我们创建,因此上述代码中我们没有为变量中不需要传值的情况考虑,因此最后一行会报错,解决办法其一是新增一个构造函数(无参数值)其二是对构造函数设置默认参数。
析构函数:
析构函数的名字是在构造函数名字前加上‘~’,并且如果存在多个类,那么析构函数在多个类结束生命周期前,按照构造函数执行顺序的逆序来执行(有点像栈)。
组合类(包容类)
组合类可以看做类的一种嵌套,在一个a类中定义b、c类的变量
class Book{ int a; } class Name{ int b; } class c{//组合类 Book a; Name b; }
其中c为组合类
组合类中的执行顺序:
组合类中优先定义内部子类的变量,然后才是自己的构造函数。
//class defination class stu{ public: stu(){ cout << "构造(stu)" << endl; } ~stu(){ cout << "析构(stu)" << endl; } }; class tea{ public: tea(){ cout << "构造(tea)" << endl; } ~tea(){ cout << "析构(tea)" << endl; } }; class tor{ public: tor(){ cout << "构造(tor)" << endl; } ~tor(){ cout << "析构(tor)" << endl; } private: stu a; tea b; }; //main int main(){ tor a; return 0; } //output 构造(stu) 构造(tea) 构造(tor) 析构(tor) 析构(tea) 析构(stu)
显然,在创建tor类变量后执行顺序为内部类构造函数(stu->tea)->自身类构造函数(tor)
组合类中的初始化
class stu{ public: stu(int a=0){ age = a; cout << "stu中age为:" << age << endl; } void operator=(int a){ this->age = a; } private: int age; }; class tor{ public: tor(int for_tor,int for_stu):a(for_stu){/******/ score = for_tor; cout << "tea中score为:" << score << endl; } private: stu a; int score; }; int main(){ tor a(1,2); return 0; }
为了在tor中使用stu的构造函数对a进行赋值,需要在tor的构造函数后,使用冒号:引出a的构造函数的参数列表,然后进行参数的赋值。
对于想要赋值多个构造函数的参数的情况,可以使用逗号来分隔。
这篇关于C++构造函数&析构函数&组合类的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升