欢迎大家来到IT世界,在知识的湖畔探索吧!
C++类的组合
C++类组合| 是什么
C++类组合是指在一个类中包含另一个类的对象,以实现某种功能或描述某种关系。例如,可以定义一个“汽车”类,其中包含了“发动机”、“轮胎”等成员,来表示一个完整的汽车实体。在这个类中,发动机和轮胎都是作为成员变量来组合到汽车类中的。一般多个事物是另一个事物的一部分的关系(a part of)时候采用组合方式。通过组合,程序员可以更好地描述实体之间的关系,使代码更加具有可读性和可维护性。在实际编程中,组合也是面向对象编程的重要手段之一。
C++类组合| 要点
C++类组合主要有两个要点必须掌握:
- 构造函数特殊写法:初始化参数列表的方式
- 构造顺序和析构问题:构造顺序和对象的定义顺序有关
初始化参数列表是用于在C++中初始化类成员变量的一种特殊语法结构。在类的构造函数定义中,使用冒号(:)后跟在构造函数名称后面的初始化参数列表,对类成员变量进行初始化。初始化参数列表的语法结构如下:
class class_name { public: // 构造函数定义 class_name(arg1_type arg1_value, arg2_type arg2_value, ...) : member1(arg_value1), member2(arg_value2), ... { // 函数体 } private: member1_type member1; member2_type member2; ... };
欢迎大家来到IT世界,在知识的湖畔探索吧!
在初始化参数列表中,需要按照成员变量在类中的声明顺序,对它们进行初始化。每个成员变量的初始化语法为“成员变量名(参数列表)”,其中参数列表是用于初始化成员变量的值。使用初始化参数列表进行成员变量初始化,可以更加高效地初始化类成员变量。如果不使用初始化参数列表,而是在构造函数体内逐个对成员变量进行赋值,会导致额外的开销,并且可能会因为忘记初始化某个成员变量而导致错误。此外,对于一些特殊类型的成员变量,如常量、引用和对象等,只能使用初始化参数列表进行初始化,无法在构造函数体内进行赋值操作。
C++类组合| 综合代码
创建一个Head类,分别有Eye类,Nose类,Mouse类组成。代码如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!#include <iostream> //眼睛 class Eye { public: Eye():Eye("明亮眼睛") {} Eye(std::string name) { eyeName = name; std::cout << "构造眼睛" << std::endl; } void print() { std::cout << eyeName << std::endl; } protected: std::string eyeName; }; //鼻子 class Nose { public: Nose():Nose("大鼻子") {} Nose(std::string name) { noseName = name; std::cout << "构造鼻子" << std::endl; } void print() { std::cout << noseName << std::endl; } protected: std::string noseName; }; //嘴巴 class Mouse { public: Mouse():Mouse("樱桃嘴") {} Mouse(std::string name) { mouseName = name; std::cout << "构造嘴巴" << std::endl; } void print() { std::cout << mouseName << std::endl; } protected: std::string mouseName; }; //组合类 class Head { public: //组合类的构造函数 //必须要调用分支类的构造函数 Head() { std::cout << "所有的分支类中存在 无参的构造函数调用形态" << std::endl; } //显式调用有参的构造函数 //初始化参数列表: 构造函数(参数1,参数2,...):数据成员1(参数1),数据成员2(参数2)...{} Head(std::string ename, std::string nname, std::string mname):eye(ename), mouse(mname),nose(nname) { std::cout << "构造head" << std::endl; } void print() { eye.print(); nose.print(); mouse.print(); } protected: //构造顺序是按照整个地方顺序进行的 Mouse mouse; Eye eye; Nose nose; }; int main() { Head head; head.print(); Head coolman("梁朝伟的眼睛", "成龙的鼻子", "彭于晏的嘴巴"); coolman.print(); return 0; }
程序运行结果如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!
C++类中类
C++类中类|是什么
C++中的类中类,也被称为嵌套类(Nested Class),指的是在一个类中定义的另一个类。类中类可以被看作是一种内部类,它们的作用范围限定在外围类的作用域内。类中类可以被用于实现更加复杂的数据结构和算法,能够方便地封装和组织代码,使代码更加可读、可维护。
C++类中类|要点
C++类中类主要有两个要点必须掌握:
- 依旧受权限限定
- 访问: 外面的类名做限定
类中类的使用方式与普通类类似,可以通过OuterClass::InnerClass来访问嵌套类,或者使用using关键字来导入嵌套类的名称。
C++类中类|综合代码
C++类中综合代码主要有以下内容:
- 直接类中定义的类中类
- 类中声明类外定义的类中类
- 使用类中类定义对象
综合测试代码如下:
#include <iostream> #include <string> class MM { public: protected: //类中声明类外实现 class Girl; public: //类中类 class Boy { public: Boy(std::string name) :name(name) {} void print() { std::cout << name << std::endl; } protected: std::string name; }; }; class MM::Girl { public: void print(); protected: }; void MM::Girl::print() { std::cout << "必须类名限定" << std::endl; } int main() { MM::Boy boy("boy"); boy.print(); //类中类依旧受权限限定 //MM::Girl girl; //错误 return 0; }
C++类中成员与参数同名问题
当C++类中成员与函数参数同名时,主要有以下三种解决方案:
- 初始化参数列表:仅限构造函数
- this指针标识:this指针是一个特殊指针,它指向当前对象本身
- 类名限定
综合测试代码如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!#include <iostream> #include <string> class MM { public: //2.初始化参数列表 MM(std::string name, int age) :name(name), age(age) { //1.类名限定 //MM::name = name; //MM::age = age; } //3.this指针 // girl.setData("小丽", 28); // this=&girl void setData(std::string name, int age) { //3.this指针标识 this->name = name; this->age = age; } MM& getObject() { return *this; } void print() { std::cout << name << "\t" << age << std::endl; } protected: std::string name; int age; }; int main() { MM girl("小芳", 18); girl.print(); girl.setData("小丽", 28); girl.print(); girl.getObject().getObject().print(); return 0; }
相关
如果阁下正好在学习C/C++,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/108191.html