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;
...
};
在初始化参数列表中,需要按照成员变量在类中的声明顺序,对它们进行初始化。每个成员变量的初始化语法为“成员变量名(参数列表)”,其中参数列表是用于初始化成员变量的值。使用初始化参数列表进行成员变量初始化,可以更加高效地初始化类成员变量。如果不使用初始化参数列表,而是在构造函数体内逐个对成员变量进行赋值,会导致额外的开销,并且可能会因为忘记初始化某个成员变量而导致错误。此外,对于一些特殊类型的成员变量,如常量、引用和对象等,只能使用初始化参数列表进行初始化,无法在构造函数体内进行赋值操作。
C++类组合| 综合代码
创建一个Head类,分别有Eye类,Nose类,Mouse类组成。代码如下:
#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;
}
程序运行结果如下:
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指针是一个特殊指针,它指向当前对象本身
- 类名限定
综合测试代码如下:
#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++,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。