博客
关于我
c++复杂数据类型——结构体、共用体、枚举、匿名类型、类型别名
阅读量:593 次
发布时间:2019-03-12

本文共 5679 字,大约阅读时间需要 18 分钟。

< html > < div > < /div > < head > < /head > < div > < /div > < body > < div > < /div > < h2 > 结构体 < /h2 > < div > < /div > < h4 > 定义 < /h4 > < div > < /div > < pre > struct MyStruct { int code; string name; float salary; } myStruct1; < myStruct myStruct2; < auto myStruct3 = new MyStruct(); //指针 < MyStruct myStruct4 = MyStruct(); < /pre > < div > < /div > < h4 > 初始化 < /h4 > < div > < /div > < pre > struct MyStruct { int code; string name; float salary; } myStruct1 = { 20, "bill", 2550 }; < MyStruct myStruct2 = { 20, "bill", 2550 }; < auto myStruct3 = new MyStruct(); myStruct3->name = "ABC"; < auto myStruct4 = (MyStruct){ 20, "bill", 2550 }; < myStruct4.code = 200; myStruct4.name = "abc"; myStruct4.salary = 20.3; < MyStruct myStruct5 = MyStruct(); myStruct5.code = 200; myStruct5.name = "abc"; mySturct5.salary = 20.3; < /pre > < div > < /div > < h4 > 结构体数组 < /h4 > < div > < /div > < pre > struct MyStruct { int code; string name; int values[2]; } myStructArray1[100]; myStructArray1[0].name = "bill"; < MyStruct myStructArray2[2] = { { 20, "Mary", { 1, 2 } }, { 30, "John", { 3, 4 } } }; < auto myStructArray3 = (MyStruct[]){ { 20, "Mary", { 1, 2 } }, { 30, "John", { 3, 4 } } }; < /pre > < div > < /div > < h4 > 结构体尺寸 < /h4 > < div > < /div > < p > 结构体尺寸的计算规则:默认情况下,结构体尺寸是结构体中占字节最多的成员变量的尺寸的整数倍。更通用的说法:结构体尺寸是当前对其方式的整数倍。 < /p > < div > < /div > < pre > struct MyStruct1 { int code1; int code2; }; cout << "MyStruct1 size:" << sizeof(MyStruct1) << endl; // 4 < struct MyStruct2 { short code1; char c; } myStruct2{ 20, 'a' }; cout << "MyStruct2 size:" << sizeof(MyStruct2) << endl; // 4 < /pre > < div > < /div > < h5 > 结构体对齐方式 < /h5 > < div > < /div > < pre > // 结构体的默认对齐方式 unsigned int n1 = (unsigned int)amp;myStruct2; bitset<32> b1(n1); cout << "myStruct2二进制表示:" << b1 << endl; // 00000000 01100001 00000000 00010100 < // 结构体对齐方式修改 struct MyStruct3 { char c; short code1; } myStruct3{ 'a', 20 }; cout << "MyStruct3 size:" << sizeof(MyStruct3) << endl; // 4 < unsigned int n2 = (unsigned int)amp;myStruct3; bitset<32> b2(n2); cout << "myStruct3二进制表示:" << b2 << endl; // 00000000 00010100 00000000 01100001 < /pre > < div > < /div > < h4 > 空结构体的size < /h4 > < div > < /div > < pre > struct NullStruct {}; cout << "NullStruct Size:" << sizeof(NullStruct) << endl; // 1 < /pre > < div > < /div > < h4 > 结构体的位字段 < /h4 > < div > < /div > < pre > struct MyStruct1 { unsigned int code1; unsigned int code2; bool flag; }; struct MyStruct2 { unsigned int code1:4; unsigned int code2:4; bool flag:1; } myStruct2{ 17, 15, false }; // 4位二进制最大值为1111 = 15,17溢出, 10001取4位 0001 = 1 cout << sizeof(MyStruct1) << endl; // 12 cout << sizeof(MyStruct2) << endl; // 4 < /pre > < div > < /div > < h2 > 共用体(联合体) < /h2 > < div > < /div > < h4 > 定义,赋值 < /h4 > < div > < /div > < pre > union MyUnion1 { int code1; long long code2; float price; bool flag; } myUnion; struct MyStruct { int code1; long long code2; float price; bool flag; } myStruct{ 20, 30, 10.4, true }; cout << "MyUnion1 size:" << sizeof(MyUnion1) << endl; // 8 cout << "MyStruct size:" << sizeof(MyStruct) << endl; // 24 < /pre > < div > < h4 > 位字段,二进制存储格式 < /h4 > < div > < /div > < pre > union MyUnion2 { int code1; long long code2:4; float price; bool flag; } myUnion2; myUnion2.code2 = 13; cout << "myUnion2.code2=" << myUnion2.code2 << endl; // -3 cout << "MyUnion2 size:" << sizeof(MyUnion2) << endl; // 8 < /pre > < div > < /div > < h2 > 枚举 < /h2 > < div > < /div > < h4 > 定义,赋值 < /h4 > < div > < /div > < pre > enum color { red, yellow, green }; color flowerColor; flowerColor = green; enum color1 { red, yellow, green }; // 会提示报错 enum Color2 { RED2/0/, GREEN2 =20, BLUE2/21/}; enum Color3 { RED3/0/, GREEN3 =0, BLUE3/1/, YELLOW3=1 }; enum Color4 { RED4 =-2, GREEN4/-1/, BLUE4/0/ }; enum Color5 { RED5='A', GREEN5/66/, BLUE5/67/}; < /pre > < div > < /div > < h4 > 枚举类 < /h4 > < div > < /div > < p > C++ 11 新特性 < /p > < div > < /div > < pre > enum class Color3 { RED, GREEN, BLUE=20 }; enum class Color4 { RED, GREEN, BLUE }; Color3 color3 = Color3::GREEN; cout << int(Color3::BLUE) << endl; cout << color1::green << endl; < /pre > < div > < /div > < h4 > 枚举类型尺寸 < /h4 > < div > < /div > < pre > enum Color1 { RED, GREEN, BLUE }; cout << "Color1 size=" << sizeof(Color1) << endl; // 4 enum class Color2 { RED = INT32_MAX-2, GREEN, BLUE /= INT32_MAX +1:溢出,会出错/}; cout << "Color2 size=" << sizeof(Color2) << endl; // 4 < enum class Color3:short { RED, GREEN, BLUE=INT16_MAX }; // short为两个字节 cout << "Color3 size=" << sizeof(Color3) << endl; // 2 < enum class Color4:unsigned char { RED, GREEN, BLUE=255 }; // 1 char为1个字节 cout << "Color4 size=" << sizeof(Color4) << endl; // C++ 11 enum class Color5:int8_t { RED, GREEN, BLUE=-128 }; // 1 int8_t为1个字节 < /pre > < div > < /div > < h2 > 匿名类型 < /h2 > < div > < /div > < pre > struct { int code; string name; int values[2]; } myStruct; < /pre > < div > < /div > < h2 > 类型别名 < /h2 > < div > < /div > < pre > struct { int code; string name; int values[2]; } myStruct; union { int code1; long long code2; float price; bool flag; } myUnion; enum { red, yellow, green } myEnum; // 匿名枚举类中,每一个枚举成员都是全局的,不能与其他枚举类型混用 enum class { red1, yellow1, green1 } myEnumClass; < /pre > < div > < /div > < h2 > 类型别名 < /h2 > < div > < /div > < p > typedef 关键字可将类型变量名变成类型,为复杂的声明定义简单的别名 < /p > < div > < /div > < pre > typedef struct { int code; string name; int values[2]; } myStruct; myStruct st; typedef union { int code1; long long code2; float price; bool flag; } myUnion; myUnion ui; typedef enum { red, yellow, green } myEnum; myEnum eu; // 匿名枚举类中,每一个枚举成员都是全局的,不能与其他枚举类型混用 typedef enum class { red1, yellow1, green1 } myEnumClass; myEnumClass ec; < /pre > < div > < /div > < / body > < /html >

转载地址:http://nrcxz.baihongyu.com/

你可能感兴趣的文章
LSM树
查看>>
Linux上elasticsearch7集群搭建
查看>>
打开网站工程时遇到配置bower显示404的问题。
查看>>
vue手写 头部 滑动按钮 点击查看更多,可折叠
查看>>
为什么 RTP 的视频的采样率是 90kHz ?
查看>>
IDEA快捷键CTRL+SHIFT+F无效
查看>>
IDEA 找不到 Persistence窗口解决办法
查看>>
ERROR: unable to bind listening socket for address...
查看>>
vagrant启动时提示 mount: unknown filesystem type 'vboxsf'
查看>>
海思SDK mkimage command not found
查看>>
QT5 退出窗口
查看>>
ov9732 datasheet
查看>>
rk3399平台gt9xx触摸屏驱动分析
查看>>
X工厂 ERP (SBO) 2006 项目案例
查看>>
Android 吸顶布局
查看>>
python学习笔记2.3- 循环、判断
查看>>
python学习笔记4.1-python高级之生成器
查看>>
U3D实现WebCamera显示
查看>>
方法的重载
查看>>
SpringCloud第七章Ribbon负载均衡服务调用
查看>>