😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:
本文未经允许,不得转发!!!
目录
- 🎄一、概述
- ✨1.1
- ✨1.2
- 🎄二、结构体(struct)
- 🎄三、共用体(union)
- 🎄四、枚举类型(enum)
- 🎄五、引用
- 🎄六、总结
🎄一、概述
本文主要介绍C++的复合类型,并且重点地介绍与C语言有区别的复合类型。C语言的复合类型主要有5种:数组、结构体、共用体、枚举类型、指针。而C++在C语言的基础上增加了两个复合类型:引用、类。
下面是C++的7种复合类型:
- 数组:基本与C语言没差别;
- 结构体(struct)
- 共用体(union)
- 枚举类型(enum)
- 指针
- 引用
- 类
其中数组、指针类型基本和C语言差不多,以前介绍C语言的文章有介绍过,这里不赘述,而类的内容很多,会在以后的文章来介绍,所以本文就介绍剩余的4种复合类型:①结构体(struct)、②共用体(union)、③枚举类型(enum)、④引用。
【C语言 | 数组】C语言数组详解(经典,超详细)
【C语言 | 指针】C指针详解(经典,非常详细)
✨1.1
✨1.2
🎄二、结构体(struct)
结构体可以存储多种类型的数据,从而将数据的表示合并在一起。
结构体是用户定义的类型,而结构体声明定义了这种类型的数据属性。 定义了类型后,便可以创建这种类型的变量。
标识符 inflatable 是这种数据格式的名称, 因此新类型的名称为 inflatable。
注意:C++允许在声明结构体变量时省略关键字 struct
,而C语言则需要带关键字 struct
。 这种变化强调的是, 结构体声明定义了一种新类型。
C++使用户定义的类型与内置类型尽可能相似。 例如, 可以将结构作为参数传递给函数, 也可以让函数返回一个结构。 另外, 还可以使用赋值运算符(=) 结构赋给另一个同类型的结构, 这样结构中每个成员都将被设置为另一个结构中相应成员的值, 即使成员是数组。
🌰举例子:
// 02_struct.cpp
// g++ 02_struct.cpp
#include <iostream>
using namespace std;
struct info_t
{
int age;
int height;
};
int main()
{
struct info_t XiaoMing; // C语言用法
info_t XiaoHong; // 1、C++声明、定义变量不需要 struct 关键字
XiaoMing.age = 18;
XiaoMing.height = 179;
XiaoHong = XiaoMing; // 2、使用 = 给另一个同类型结构体赋值
cout << "XiaoMing: age=" << XiaoMing.age << " height=" << XiaoMing.height <<endl;
cout << "XiaoHong: age=" << XiaoHong.age << " height=" << XiaoHong.height <<endl;
return 0;
}
运行结果如下:
🎄三、共用体(union)
共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。
共用体的用途之一是, 当数据项使用两种或更多种格式(但不会同时使用)时,可节省空间。
匿名共用体(anonymous union) 没有名称, 其成员将成为位于相同地址处的变量。 显然, 每次只有一个成员是当前的成员:
struct widget
{
char brand[20];
int type;
union
{
long id_num;
char id_char[20];
}
};
注意:C++允许在声明共用体变量时省略关键字 union
,而C语言则需要带关键字 union
。
🌰举例子:
// 02_union.cpp
// g++ 02_union.cpp
#include <iostream>
#include <cstring>
using namespace std;
union info_t
{
char c;
int i;
};
struct widget
{
char brand[20];
int type;
union // 3、匿名共用体
{
long id_num;
char id_char[20];
};
};
int main()
{
union info_t XiaoMing; // C语言用法
info_t XiaoHong; // 1、C++声明、定义变量不需要 union 关键字
memset(&XiaoMing, 0, sizeof(XiaoMing));
memset(&XiaoHong, 0, sizeof(XiaoHong));
XiaoMing.c = 'A';
XiaoHong = XiaoMing; // 2、使用 = 给另一个同类型共用体赋值
cout << "XiaoMing: c=" << XiaoMing.c << " i=" << XiaoMing.i <<endl;
cout << "XiaoHong: c=" << XiaoHong.c << " i=" << XiaoHong.i <<endl;
widget prize;
prize.type = 1;
prize.id_num = 666666;
cout << "prize: id_num=" << prize.id_num <<endl;
return 0;
}
运行结果:
🎄四、枚举类型(enum)
C++的枚举类型(enum)提供了另一种创建符号常量的方式, 这种方式可以代替 const。它还允许定义新类型,但必须按严格的限制进行。 使用 enum 的句法与使用结构相似。 例如, 请看下面的语句:
enum spectrum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
这条语句完成两项工作:
1、让 spectrum 成为新类型的名称; spectrum 被称为枚举(enumeration),就像 struct 变量被称为结构体—样。
2、将 red、orange、yellow 等作为符号常量, 它们对应整数值 0 7。 这些常量叫作枚举量(enumerator)。
在默认情况下, 将整数值赋给枚举量, 第一个枚举量的值为 0, 第二个枚举量的值为 1, 依次类推。但是,可以使用赋值运算符来显式地设置枚举量的值: enum bits{one = 1, two = 2, four = 4, eight = 8};
。指定的值必须是整数。 也可以只显式地定义其中一些枚举量的值:enum bigstep{first, second = 100, third};
,后面没有被初始化的枚举量的值将比其前面的枚举量大 1。
枚举变量具有一些特殊的属性:
1、在不进行强制类型转换的情况下, 只能将定义枚举时使用的枚举量赋给这种枚举的变量。
2、对于枚举, 只定义了赋值运算符。 具体地说, 没有为枚举定义算术运算。
3、枚举量是整型, 可被提升为 int 类型, 但 int 类型不能自动转换为枚举类型,如:int i = red
4、如果打算只使用常量, 而不创建枚举类型的变量, 则可以省略枚举类型的名称, 如下面的例子所示:
enum {red, orange, yellow, green, blue, violet, indigo, ultraviolet};
枚举的取值范围:
- 上限:大于枚举的最大值的最小的2的幂次方的数减一。如
enum bigstep{first, second = 100, third};
中,枚举最大值是101,大于101的2的幂次方的数是128,所以这个枚举的上限是127。- 下限:如果枚举最小值不小于 0, 则取值范围的下限为 0;如果小于0,则是小于枚举的最小值的最大的2的幂次方的数加一。如,最小值是-6,比-6小的最大2的幂次方数是-8,所以该枚举下限是-7。
🎄五、引用
🎄六、总结
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁