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

相关推荐
Ylucius1 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
是店小二呀1 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
ephemerals__1 小时前
【c++】动态内存管理
开发语言·c++
CVer儿1 小时前
条件编译代码记录
开发语言·c++
程序猿练习生2 小时前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode
汉字萌萌哒2 小时前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法
th新港2 小时前
CCF201909_1
数据结构·c++·算法·ccf
意如流水任东西2 小时前
[C++]类和对象(上)
开发语言·c++
孤寂大仙v2 小时前
【C++】STL----stack和queue常见用法
开发语言·c++
一丝晨光2 小时前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符