结构
C++提供了struct关键字可以将不同类型封装在一起,形成结构体.
数组中存储的是相同类型的数据,而结构中可以存储不同类型的数据。定义结构就像定义一个新的数据类型一样.
结构是类的基石
结构的定义、声明与初始化
定义语法格式:
struct 结构体类型名
{
成员列表;
};//此处有分号
1.仅仅是定义的话,系统不会为结构体类型开辟空间.系统会为结构体类型的变量开辟空间.
2.结构体中的成员有各自独立的空间.
3.定义结构体时,不要给成员初始化值(嵌入式设备对新特性兼容不是很好).只有最新的c++11可以,这相当于给实例默认值.
代码
#include <iostream>
using namespace std;
//1.定义结构
struct person
{
char name[10];
int age;
};
//2.定义结构的同时创建结构变量
struct animal
{
char name[10];
int weight;
} bird, dog;
//3.定义结构同时创建结构变量并初始化
struct drink
{
char name[10];
} milk =
{
"伊利"};
//4.定义没有名称的结构
struct
{
int x;
int y;
/* data */
} position; //除了定义时创建结构变量,后面无法创建结构变量了,因为该结构没有名称
int main()
{
struct person sam;
person amy; //声明结构变量时可以省略struct
//声明结构变量并初始化
person andy =
{
"andy",
18};
//初始化的值可以写在一行
person sara = {"sara", 19};
//初始化并省略等号
person summer{"summer", 20};
//大括号为空则默认初始化各项为零
person jerry{};
//两个同类型结构间可以赋值
jerry = summer;
cout << summer.name << endl
<< summer.age << endl;
return 0;
}
解析:
- 结构体变量如果不初始化则其成员的值随机/不确定
- 结构体变量初始化时必须按照成员的顺序及数据类型初始化
清空结构体
函数原型
void * memset(void *_Dst,int _Val,size_t _Size)
//作用:将_Dst地址开始的_Size字节值都设置为_Val
#include <iostream>
#include <string.h>
using namespace std;
struct person
{
int age;
char name[32];
};
int main(int argc, char *argv[])
{
person Amy{13,"amy"};
cout<<Amy.name<<endl;
memset(&Amy,0,sizeof(Amy));//参数:(地址,字节设置为0,结构体大小)
cout<<Amy.age<<endl;
return 0;
}
运行结果
键盘给结构体中的成员赋值
#include <iostream>
#include <string.h>
using namespace std;
struct person
{
int age;
char name[32];
};
int main(int argc, char *argv[])
{
person Amy;
memset(&Amy,0,sizeof(Amy));
cout<<"请输入年龄、姓名"<<endl;
cin>>Amy.age>>Amy.name;
cout<<Amy.age<<" "<<Amy.name<<endl;
return 0;
}
运行结果
结构数组
可以创建每个元素都是结构的数组
#include <iostream>
using namespace std;
//定义结构
struct person
{
char name[10];
int age;
};
int main()
{
person teacher[10];
person student[100] =
{
{"Sam", 18}, {"Amy", 19}, {"Alon", 20}};
cout << student[0].name << endl;
return 0;
};
结构中的位字段
共用体
结构体:所有成员具有独立的空间
共用体:多个成员共享同一份空间
共用体空间的大小由占用空间最大的成员类型决定
#include <iostream>
using namespace std;
int main()
{
union Data
{
short a;
char b;
int c;
};
Data da;
da.a = 10;
da.b = 20;
da.c = 30;
cout << da.a + da.b + da.c << endl;
return 0;
};
运行结果
解析:
由于最后一次赋值为30,因此这片空间内存储的值为30,abc共用30.
共用体常用于节省内存.当前的计算机内存可能多大数GB,甚至是TB,似乎没有必要节省内存.对于一些嵌入式小型设备比如烤箱、MP3播放器等设备来说,内存很宝贵.
另外,共用体常用于操作系统数据结构或硬件数据结构.
枚举
批量声明多个常量,声明的枚举类型变量只能赋指定列表里的值.
#include <iostream>
using namespace std;
enum POKER_COLOR
{
HONGTAO,
MEIHUA,
FANGKUAI,
HEITAO
};//枚举值自动从0 1 2 3的顺序往后延续
int main()
{
POKER_COLOR PC = HONGTAO;
cout << PC << endl;
cout << HONGTAO << " " << MEIHUA << " " << FANGKUAI << " " << HEITAO << endl;
return 0;
};
运行结果
更改枚举默认值
#include <iostream>
using namespace std;
enum POKER_COLOR
{
HONGTAO,
MEIHUA = 10,//等号的意思为关联MEIHUA和10,并非赋值
FANGKUAI,
HEITAO
}; //枚举值自动从0 1 2 3的顺序往后延续
int main()
{
POKER_COLOR PC = HONGTAO;
cout << PC << endl;
cout << HONGTAO << " " << MEIHUA << " " << FANGKUAI << " " << HEITAO << endl;
return 0;
};
运行结果
解析:
更改默认枚举值后,该枚举值后续将从更改处延续