六、结构体

时间:2020-01-24 14:34:28   收藏:0   阅读:78

6.1 结构体概念

6.2 C++语言中的结构体

6.2.1 结构体的声明和定义

6.3 结构体内存分配机制

  1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除

  2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

  3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节

  4. 例如:

    • struct Stu {
        char a;
        int b;
        char c;
      };
      1. Stu中,最宽数据类型为int,在32位系统中为4Byte);
      2. 参照第二条,第一个数据是char,存储一个char1 Byte ,要保证下一个int的存储起始地址是4的整数倍,所以要在char后面填充 3 Byte,然后再存储int 变量 b
      3. 最后一个也是char 类型,他就占1 Byte ,肯定是他存储位置的整数倍
      4. 最后参照第三条,结构体的总大小为最宽数据类型的整数倍,所以会在第二个char 之后再填充3 Byte
      5. 这样的话,总共占据的空间是1+3+4+1+3 = 12(红色为填充字节)
    • 但是,调换一下结构中数据成员的顺序:

      struct s1 {
        int b;
        char a;
        char c;
      };
      • 同样地分析4+1+1+2 = 8
      • 相比之下,存储空间的效率提高33%。
      • 提示:在竞赛阶段,为了节约内存,在组织数据结构的数据成员的时候,可以将相同类型的成员放在一起,这样就减少了编译器为了对齐而添加的填充字符。

6.4 结构体初始化

  1. 定义时初始化
struct Stu{
    int Num;
    bool Sex;
    char Name[20];
};
//定义时初始化
Stu a={0};//初始化所有成员为0
Stu b={15,1,"Tom"};//依次为成员赋值
  1. 构造函数初始化
方法一:
struct Stu{
    int Num;
    bool Sex;
    char Name[20];
    //构造函数初始化
    Stu(){
        Num=0;
        Sex=false;
        memset(Name,0,sizeof(Name));
    }
};
方法二:
struct Stu{
    int Num;
    bool Sex;
    char Name[20];
    //构造函数初始化
    Stu(){
        memset(this->Name,0,sizeof(Name));
    }
};
  1. 结构体成员的访问可以使用成员运算符:"."
struct Stu{
    int Num;
    bool Sex;
    char Name[20];
    //构造函数初始化
    Stu(){
        memset(this,0,sizeof(Name));
    }
};
Stu a;
//访问结构体a的成员函数
a.Num=10;
a.Sex=1;
a.Name="Tom";

6.5 结构体重载运算符重载

6.5.1 运算符重载

6.5.2 结构体重载运算符重载

原文:https://www.cnblogs.com/hbhszxyb/p/12232125.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!