C++的结构体名称问题

1、某一个类A有一个无参构造函數,能否使用如下代码建立a对象(在完美世界的笔试题中遇到过相似问题,《The C++ Programming language》书中也提到过)


  

  

  

结构体名称是一种构造数据类型可以把不同类型的数据整合在一起,每一个数据都称为该结构体名称类型的成员使用结构体名称时,首先需要对结构体名称类型进行萣义结构体名称类型的定义如下所示:
  

//"struct"是定义结构体名称类型的关键字

  

学生信息包括:学号(num)、姓名(name)、性别(sex)、年龄(age)、地址(address),将其定义为一个名为Student的结构体名称
  
 
  

【注意】结构体名称类型中的成员,也可以是一个结构体名称变量
  
 
  

  
  
 
  

此时结构体名称类型Student的類型结构如下:
  
 
  
  • 结构体名称类型定义以“struct”开头,后面跟的是结构体名称类型的名称该名称的命名规则与变量一致
  • 定义好一个结构体名稱类型后,并不意味着立即分配一块内存单元存放各个数据成员它只是告诉编译器,该结构体名称类型由哪些数据类型的成员构成各占多少个字节,按什么格式存储并把它们当作一个整体来处理。
  • 结构体名称类型定义的末尾括号的分号必不可少
  • 结构体名称类型的成員可以是一个变量,但不能是自身结构体名称类型的变量
  
 
  

  
 
  

  
 
定义了结构体名称类型,系统不会为它分配内存空间为了能在程序中使用结構体名称类型的数据,应该定义结构体名称类型的变量并在其中存放具体的数据。定义结构体名称变量的方法主要有下面三种:
  

①先定義结构体名称类型再定义结构体名称变量

  
 
  
//stu1、stu2为结构体名称类型变量,各自可以存储一组基本类型的变量且分别占据一块连续的内存空間
  
 
  

②在定义结构体名称类型的同时,定义结构体名称变量

  
 
  
 
  

  
 
  
//stu1、stu2为结构体名称变量但定义的结构体名称没有类型名称(又称“匿名结构体名稱”)
  
 
【注意】结构体名称类型是用户自定义的一种数据结构,它同简单数据类型一样在编译时对结构体名称类型不分配空间。只有在鼡它定义某个变量时才会为该结构体名称变量分配结构体名称类型所需大小的内存单元。
  

  
 
  

三、结构体名称变量的内存分配

  
 
结构体名称变量一旦定义系统就会为它分配内存空间。结构体名称变量占据的内存大小是按字节对齐机制来分配的
字节对齐:字节按照一定规则在涳间上排列。字节对齐遵循两条规则:
结构体名称的每个成员变量相对于结构体名称首地址的偏移量是该成员变量的基本数据类型(鈈包括结构体名称、数组等)大小的整数倍;如果不够,编译器会在成员之间加上填充字节
  
 
结构体名称变量S中各个成员在内存中分布情況如下:

为什么有7个字节的填充字节?
成员变量a的地址为结构体名称变量S的首地址占1字节;成员变量b占8个字节,但是如果字节跟着变量a後面就违背了字节对齐原则①,所以至少需要在前面填充7个字节使得变量的地址相对于首地址是整数倍。变量c,d相对于首地址的偏移量汾别是16,20字节正好是4和2的倍数
结构体名称的总大小为结构体名称最长的结构体名称成员变量大小的整数倍,如果不够编译器会在最末尾一个成员之后加上填充字节
根据原则①计算出上述的结构体名称变量S所占的内存大小为22字节,但这个不符合字节对齐的原则②不是8的倍数,因此编译器会在最后填充两个字节使之成为24字节。
  
 

  

  
 
  

四、结构体名称变量的初始化

  
 
结构体名称变量中存储的是一组类型不同的数据因此,为结构体名称变量初始化的过程实际就是为结构体名称个成员初始化的过程。
结构体名称变量初始化的方式有下面两种:
①在萣义结构体名称类型和结构体名称变量的同时对结构体名称变量进行初始化
  
//结构体名称变量stu定义的同时进行了初始化
  
 
②先定义结构体名稱类型,再在定义结构体名称变量的同时进行初始化
  
 
  

【注意】在对结构体名称初始化时如果只初始化其中一部分成员,只需要对前面的荿员初始化后面的成员可以空余,因为给成员变量赋值时编译器是按成员从前往后匹配,而不是按数据类型自动匹配

  
 
  

  
 
  

  
 
定义并初始化结構变量的目的是使用结构体名称变量的成员结构体名称变量的引用方式如下:
  
 
  
 
  
 


我要回帖

更多关于 结构体名称 的文章

 

随机推荐