C++:聚合类、嵌套类、局部类、union类详细介绍与分析

聚合类

(1)What(什么是聚合类)

本质是一个自定义类型的数据结构(结构体或类),但聚合类有以下特性:

  • 所有的成员都是public
  • 没有任何构造函数
  • 没有基类
  • 类内部没有初始值

(2)Why(聚合类的作用)

主要目的是提供一种简单且高效的方式来组织和管理数据。它们通常用于表示简单的 数据结构,如结构体或记录类型,而不涉及复杂的行为和操作

(3)How(如何定义和使用聚合类)

cpp 复制代码
struct Point{
	double dx;
	double dy;
};
Point pt01 = {1.1, 2.2};
Point pt02{3.3, 4.4};

嵌套类

(1)What(什么是嵌套类)

定义或声明在类内部的类,它可以访问外部类的私有成员,并能在外部类作用域内使用

(2)Why (嵌套类的作用)

封装和隐藏:将嵌套类进行私有化,实现封装和隐藏

组织和结构化:将一个类嵌套到另一个类,可以清晰的表达两个类之间的关系

实现设计模式:如工厂模式、建造者模式等

命名空间嵌套:有助于避免命名空间冲突

(3)How(如何使用嵌套类)

cpp 复制代码
class Student 
{
private:
	string name;
	int age;
...
}
class Grade
{
private:
	Student student; //Student在类Grade中声明,Student属于类Grade的嵌套类
...
}

局部类

(1)What(什么是局部类)

定义在函数内部或代码块中的类被称为局部类,它的作用域是该函数内部或代码块中

局部类具有以下特性:

  • 不允许存在静态的成员
  • 只允许访问外层作用域的静态变量、枚举和类型名
  • 可以访问全局变量(使用:: ):😃

(2)Why(局部类的作用)

  • 封装:隐藏细节
  • 避免命名冲突:由于只对作用域可见,有助于避免命名冲突,提供更好的隔离性
  • 增加代码的可维护性

union类

(1)What(什么是union类)

本质是一种类,这种类有以下特点:union类可以包含多个成员,但同一时刻只能使用其中一个成员,当其中一个成员被赋值时,其它成员就会变成未定义的状态

(2)Why(union类的作用)

节省内存 :当需要存储多种内存数据,但是每次只使用其中一种时
灵活处理异构数据:提供了一种灵活的数据结构,在无需定义多个变量或复杂数据结构的情况下存储和操作不同类型的数据

(3)How(如何使用union类)

cpp 复制代码
struct Rectangle{ float height; float width; }; 
struct Circle { float radius; };
// 定义 union 类 
union Shape {
	Rectangle rect; 
	Circle circle;
};
float calculateArea(const Shape &shape, string mode) 
{ 
	if (mode == "circle") 
		return 3.1415926 * shape.circle.radius * shape.circle.radius; 
	if (mode == "rect")  
		return shape.rect.width * shape.rect.height;
	return 0;
}
// 创建 union 对象 Shape shape;
string mode = "circle"; 
shape.circle.radius = 5;
cout << shape.rect.width << "," << shape.rect.height << endl; //此处会报错
std::cout << "圆的面积:" << calculateArea(shape, mode) << std::endl; // 打印:78.5398 
mode = "rect";
shape.rect.height = 4; 
shape.rect.width = 6;
std::cout << "矩形的面积:" << calculateArea(shape, mode) << std::endl; // 打印:24

(4)匿名的union类

A.What(什么是匿名的union类)

本质:一个union类,它具有以下特性

  • 一旦定义了匿名的union类,编译器就会为它创建一个未命名的对象
  • 作用域内能够访问大匿名union类的所有成员
  • 匿名的union类中的成员必须是public的
  • 匿名的union类中不能定义成员函数,只能作纯数据的结构体使用

B.How(如何使用union类)

cpp 复制代码
class UnionBaseType
{
private: 
	enum {INT, DOUBLE, CHAR, STRING } tp; // 通过匿名枚举类型定义一个变量 tp 
	union {
		int ival; 
		double dval; 
		string sval; 
	}; // 外层作用域可直接访问匿名 union 中的成员 
public:
	// 默认构造函数 UnionBaseType() : tp(INT), ival(0) {} // 拷贝构造函数
	UnionBaseType(const UnionBaseType &obj)
	{
		tp = obj.tp; copyUnion(obj);
	}
	~UnionBaseType()
	{
		if (tp == STRING) sval.~string(); 
	}
	void copyUnion(const UnionBaseType &obj)
	{
		switch (obj.tp){
			case UnionBaseType::INT: ival = obj.ival; break; 
			case UnionBaseType::DOUBLE: dval = obj.dval; break; 
			case UnionBaseType::STRING: new (&sval) string(obj.sval); break;// 实现对对象的拷贝 
			default: break;
	} 

	// 对 int 成员进行赋值 
	UnionBaseType &operator=(int ival_) 
	{
		if (tp == STRING) sval.~string(); 
		tp = UnionBaseType::INT; 
		ival = ival_; 
		return *this;
	}
	// 对 double 成员进行赋值 
	UnionBaseType &operator=(double dval_) 
	{
		if (tp == STRING) sval.~string();
		tp = UnionBaseType::DOUBLE; 
		dval = dval_; 
		return *this;
	}
	// 对 string 成员进行赋值 
	UnionBaseType &operator=(const string &sval_) {
		if (tp == STRING) sval = sval_;
		else 
			new (&sval) string(sval_); 
		tp = UnionBaseType::STRING; 
		return *this;
	}
	// 展示信息 
	void show() const{
		if (tp == INT) cout << ival << endl; 
		if (tp == DOUBLE) cout << dval << endl; 
		if (tp == CHAR) cout << cval << endl; 
		if (tp == STRING) cout << sval << endl;
	}
}

================================================================================

C++知识点总结全系列文章索引:
【C++知识点总结全系列 (01)】:数据类型、数据类型转换和变量
【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结
【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)
【C++知识点总结全系列 (04)】:C++类的详细总结与分析
【C++知识点总结全系列 (05)】:IO 类的详细总结和分析
【C++知识点总结全系列 (06)】:STL六大组件详细总结与分析- 配置器、容器、迭代器、适配器、算法和仿函数

【C++知识点总结全系列 (07)】:模板与泛型编程详细总结与分析
【C++知识点总结全系列 (08)】:面向对象编程OOP

相关推荐
火云洞红孩儿20 分钟前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
FeboReigns2 小时前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns2 小时前
C++简明教程(10)(初识类)
c语言·开发语言·c++
zh路西法2 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
.Vcoistnt2 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
小k_不小2 小时前
C++面试八股文:指针与引用的区别
c++·面试
沐泽Mu2 小时前
嵌入式学习-QT-Day07
c++·qt·学习·命令模式
ALISHENGYA3 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
数据结构·c++·算法·图论
GOATLong3 小时前
c++智能指针
开发语言·c++