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

相关推荐
起名字真南15 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
少年负剑去15 分钟前
第十五届蓝桥杯C/C++B组题解——数字接龙
c语言·c++·蓝桥杯
cleveryuoyuo16 分钟前
AVL树的旋转
c++
神仙别闹39 分钟前
基于MFC实现的赛车游戏
c++·游戏·mfc
小c君tt1 小时前
MFC中 error C2440错误分析及解决方法
c++·mfc
木向1 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越1 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
hunandede2 小时前
FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
c++
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三:将AVFrame转换成AVPacket。视频编码,AVPacket 重要函数,结构体成员学习
c++·ffmpeg·音视频
奋斗的小花生8 小时前
c++ 多态性
开发语言·c++