结构体是对数据的整合
共用体和结构体很类似,像一个存储空间可变的数据类型,使得程序设计更加灵活
枚举是特殊的常量,增加代码的可读性
1.结构体
1)结构体定义时直接赋值的方法
struct node{
int a;
int b;
string str;
} ex = {1,2,"abc"};
2)结构体的嵌套
结构体内可以嵌套结构体,使用时同样,访问成员变量利用:"."
#include<bits/stdc++.h>
using namespace std;
int main() {
struct PersonInfo {
int index;
char name[30];
short age;
struct WorkPlace {
char Address[150];
char PostCode[30];
char GateCode[50];
char Street[100];
char Area[50];
} WP;
};
PersonInfo pInfo;
strcpy(pInfo.WP.Address,"House");
strcpy(pInfo.WP.PostCode,"10000");
strcpy(pInfo.WP.GateCode,"302");
strcpy(pInfo.WP.Street,"Lan Tian");
strcpy(pInfo.WP.Area,"china");
cout << pInfo.WP.Address << endl;
cout << pInfo.WP.PostCode << endl;
cout << pInfo.WP.GateCode<< endl;
cout << pInfo.WP.Street << endl;
cout << pInfo.WP.Area << endl;
return 0;
}
//House
//10000
//302
//Lan Tian
//china
3)结构体的大小
1.非对齐单位的结构体大小:直接相加即可
#include<bits/stdc++.h>
using namespace std;
int main(){
struct node{
int index;
char name[30];
short age;
}ex;
cout << sizeof(ex) << endl;
return 0;
}
//36
2.设置对齐单位的结构体,按照对齐单位(一般为8)来计算即可
3.默认对齐的情况下,计算是不同的,如果成员变量都大于定义的对齐宽度(ex:#pragma pack(4))则按照默认的来对齐,否则按照最大的计算
#include<bits/stdc++.h>
using namespace std;
int main(){
struct node1{
int index;
char name[30];
short age;
}ex1;
struct node2{
char name[30];
int index;
short age;
}ex2;
cout << sizeof(ex1) << endl;
cout << sizeof(ex2) << endl;
return 0;
}
//36
//40
对于第二个结构体,按照4的倍数对齐,第一个30不是4的倍数,则变为32,加第二个4为36,最后为2加上去为38,不是4的倍速,变成40
#pragma pack(8)
可以改变编译器的对齐方式
4)重命名数据类型
#include <iostream>
#include <string>
using namespace std;
namespace pet {
typedef string kind;
typedef string petname;
typedef string voice;
typedef class dog {
private:
kind m_kindName; //宠物狗种类
protected: //假如有别需要子类继承,则不需要使用种类这个属性。
petname m_dogName;
int m_age;
voice m_voice;
void setVoice(kind name);
public:
dog(kind name);
void sound();
void setName(petname name);
} Dog,DOG; //声明了别名,用Dog,DOG代替类dog
void dog::setVoice(kind name) {
if(name == "北京犬") {
m_voice = "嗷嗷";
} else if(name == "狼犬") {
m_voice = "呜嗷";
} else if(name == "黄丹犬") {
m_voice = "喔嗷";
}
}
dog::dog(kind name) {
m_kindName = name;
m_dogName = name;
setVoice(name);
}
void dog::sound() {
cout<<m_dogName<<"发出"<<m_voice<<"的叫声"<<endl;
}
void dog::setName(petname name) {
m_dogName = name;
}
}
using pet::dog; //使用pet空间的宠物犬dog类
using pet::DOG;
int main() {
dog a = dog("北京犬"); //名称空间的类被包含进来后,可以直接使用
pet::Dog b = pet::Dog("狼犬"); //别名仍需要使用名字空间
pet::DOG c = pet::DOG("黄丹犬");
a.setName("小白");
c.setName("阿黄");
a.sound();
b.sound();
c.sound();
return 0;
}
typedef用途:1.复杂的基本的数据类型 2.使用其他人开发的类型时,使其变成符合自己的代码风格习惯(规范)
typedef的作用域:别名声明所在的区域(包括名称空间)
扫描二维码关注公众号,回复:
5097915 查看本文章
明天再写qwq~
5)结构体也可以作为函数的参数进行传递
#include<bits/stdc++.h>
using namespace std;
struct node{
int a;
string str;
};
void print_struct(node Node){
cout << Node.a << endl;
}
int main(){
node test = {21};
print_struct(test);
return 0;
}
//21
6)使用指针访问结构体数组
#include <iostream>
using namespace std;
int main() {
struct PersonInfo {
int index;
char name[30];
short age;
} Person[5]= {{1,"张三",20},
{2,"李",21},
{3,"宋",22},
{4,"元",22},
{5,"王",22}
};
struct PersonInfo *pPersonInfo;
pPersonInfo=Person;
for(int i=0; i<5; i++,pPersonInfo++) {
cout << pPersonInfo->index << endl;
cout << pPersonInfo->name << endl;
cout << pPersonInfo->age << endl;
}
return 0;
}
2.共用体
1)定义与声明
共用体与结构体类似,但是在共用体内存中占用首地址相同的一段存储单元
#include<bits/stdc++.h>
using namespace std;
union Node{
int a;
double b;
double c;
}node;
int main(){
Node test;
return 0;
}
2)共用体的大小与使用
共用体的大小是最长的成员的长度
#include<bits/stdc++.h>
using namespace std;
union myUnion {
int iData;
char chData;
float fData;
} uStruct;
int main() {
uStruct.chData='A';
uStruct.fData=0.3;
uStruct.iData=100;
cout << uStruct.chData << endl;
cout << uStruct.fData << endl;
cout << uStruct.iData << endl; //正确显示
uStruct.iData=100;
uStruct.fData=0.3;
uStruct.chData='A';
cout << uStruct.chData << endl; //正确显示
cout << uStruct.fData << endl;
cout << uStruct.iData << endl;
uStruct.iData=100;
uStruct.chData='A';
uStruct.fData=0.3;
cout << uStruct.chData << endl;
cout << uStruct.fData << endl; //正确显示
cout << uStruct.iData << endl;
return 0;
}
特点:
1.使用共用体变量的目的是希望同一个内存段存放不同类型的数据,每一个瞬间只能存放一种,而不是存放几种
2.能够被访问的是共用体变量中最后一次被赋值的成员
3.共用体变量的地址和它的各成员的地址都是同一地址
4.不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体 变量时初始化;共用体变量不能作为函数的参数。
3.枚举类型
1)声明形式
enum 枚举类型名 {标识符列表}
赋值常数的三个情况:
1.编译器自动赋值常数
#include<bits/stdc++.h>
using namespace std;
//enum weekday{Sunday = 0,Monday = 1,Tuesday = 2,Wednesday = 3,Friday = 5,Saturday = 6};
enum weekday{Sunday,Monday,Tuesday,Wednesday,Friday,Saturday};
int main(){
weekday test = Monday;
cout << test << endl;
return 0;
}
//1
编译器会按照0开始的递增顺序自动赋值
2.自行修改整型常数的值
#include<bits/stdc++.h>
using namespace std;
enum weekday{Sunday = 7,Monday = 666,Tuesday = 2,Wednesday = 3,Friday = 5,Saturday = 6};
//enum weekday{Sunday,Monday,Tuesday,Wednesday,Friday,Saturday};
int main(){
weekday test = Monday;
cout << test << endl;
return 0;
}
//666
3.部分缺省:剩余部分按照递增顺序自动赋值
#include<bits/stdc++.h>
using namespace std;
enum weekday{Sunday = 7,Monday = 1,Tuesday,Wednesday,Friday = 66,Saturday};
//enum weekday{Sunday,Monday,Tuesday,Wednesday,Friday,Saturday};
int main(){
weekday test = Tuesday;
cout << test << endl;
test = Saturday;
cout << test << endl;
return 0;
}
//2
//67
2)赋值方式
#include <bits/stdc++.h>
using namespace std;
int main() {
enum Weekday {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
int a = 2,b = 1;
Weekday day;
day = Sunday;//直接赋值
cout << day << endl;
day = (Weekday)a;//整数可以强制转换成enum类型
cout << day << endl;
day = (Weekday)(a - b);
cout << day << endl;
day = (Weekday)(Sunday + Wednesday);
cout << day << endl;
day = (Weekday)5;
cout << day << endl;
return 0;
}
3)枚举类型的运算
#include <bits/stdc++.h>
using namespace std;
enum Weekday {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
int main() {
Weekday day1,day2;
day1 = Monday;
day2 = Saturday;
int n;
n = day1;
n = day2 + 1;
if(n > day1) //可以比较
cout << "n>day1" <<endl;
if(day1 < day2)
cout << "day1<day2" <<endl;
return 0;
}