寒假C++学习3-结构体 && 共用体 && 枚举类型

结构体是对数据的整合

共用体和结构体很类似,像一个存储空间可变的数据类型,使得程序设计更加灵活

枚举是特殊的常量,增加代码的可读性


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的作用域:别名声明所在的区域(包括名称空间)

明天再写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;
}

猜你喜欢

转载自blog.csdn.net/guifei0/article/details/86649716
今日推荐