🍓结构体
2022-5-1
| 2023-8-2
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 

结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,是一种复合数据类型。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
 
C++继承了Cstruct,并且加以扩充。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到CC++过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能
 
C++中,structclass基本是通用的,唯一不同的是:
  • 如果使用class关键字,类中定义的成员变量或成员函数默认都是private属性的
  • 而采用struct ,结构体中定义的成员变量或成员函数默认都是public属性的
注:在一般情况下,tag、member-list、variable-list这3部分至少要出现2个
 

结构声明

结构声明描述了一个结构的组织布局,声明类似下面这样:
该声明并未创建实际的数据对象,只描述了该对象由什么组成。有时把结构声明称为模板,因为它勾勒出结构是如何储存数据的。
 
关键字 struct,它表明跟在其后的是一个结构,后面是一个可选的标记,稍后程序中可以使用该标记引用该结构。后面的程序可以这样声明:
结构的标记名是可选的。但是,在一处定义结构布局,在另一处定义实际的结构变量,必须使用标记。
如果把结构声明置于一个函数的内部,它的标记就只限于该函数内部使用;如果把结构声明置于函数的外部,那么该声明之后的所有函数都能使用它的标记。
 

结构变量

结构有两层含义。一层含义是“结构布局”。结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间。下一步是创建一个结构变量,即是结构的另一层含义。
 
创建结构变量:
编译器执行这行代码便创建了一个结构变量library。编译器使用book模板为该变量分配空间:两个字符串和一个float类型变量。这些存储空间都与一个名称library结合在一起
 
在结构变量的声明中,struct book所起的作用相当于一般声明中的intfloat,可以定义两个struct book类型的变量,或者甚至是指向struct book类型结构的指针:
结构变量doylepanshin中都包含titleauthorvalue部分。指针ptbook可以指向doylepanshin或任何其他book类型的结构变量。从本质上看,book结构声明创建了一个名为struct book的新类型。
 
就计算机而言:
 
换言之,声明结构的过程和定义结构变量的过程可以组合成一个步骤。如下所示,组合后的结构声明和结构变量定义不需要使用结构标记:
然而,如果打算多次使用结构模板,就要使用带标记的形式。或者,使用typedef
 

初始化结构

初始化变量和数组如下:
 
初始化一个结构变量与初始化数组的语法类似:
使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。
 
也可以使用构造函数来初始化结构体成员变量:
 

访问结构成员

使用结构成员运算符——点(.)访问结构中的成员。例如,library.value即访问libraryvalue部分。本质上,.title.author.value的作用相当于book结构的下标。
因为结构数据成员是公共的,所以它们可以被直接访问,并且可以像常规变量一样使用
 

结构数组

声明结构数组和声明其他类型的数组类似。下面是一个声明结构数组的例子:
以上代码把library声明为一个内含MAXBKS个元素的数组。数组的每个元素都是一个book类型的数组。因此,library[0]是第1个book类型的结构变量,library[1]是第2个book类型的结构变量。
notion image

结构体嵌套

一个结构体的实例也可以嵌套在另一个结构体中
 
 

指向结构的指针

声明和初始化结构指针

声明结构指针:
首先是关键字struct,其次是结构标记book,然后是一个星号(*),其后跟着指针名。
 
该声明并未创建一个新的结构,但是指针library现在可以指向任意现有的book类型的结构。例如,如果Book1是一个book类型的结构,可以这样写:
和数组不同的是,结构名并不是结构的地址,因此要在结构名前面加上&运算符。
 
如果Book1是一个结构数组,这意味着 Book1[0]是一个结构。所以,要让 library 指向Book1[0],可以这样写:
 

用指针访问成员

第1种方法也是最常用的方法:使用->运算符。
第2种方法是,以这样的顺序指定结构成员的值:如果library==&Book1,那么*library== Book1,因为&*是一对互逆运算符。
 
 
C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有类的功能,与class不同的是,结构体包含的函数默认为public,而不是private
C++中的结构体与类的区别:
  • class中默认的成员访问权限是private的,而struct中则是public
  • class继承默认是private继承,而从struct继承默认是public继承
 
 
C++11中允许为数据成员类内初始值,没有初始值的成员将执行默认的初始化(内置类型的值是未定义的,类执行类的默认构造函数)。类内初始值的形式必须是列初始化或者等号初始化,类似于函数调用的括号形式的初始化是不允许的。类内初始值并没有限制哪些类型的成员可以被初始化,事实上,即便是类类型亦是可以在类中初始化。
C++规定在同一个文件中只能有一个同一个类的定义,这类似于 static 变量或者 const 变量。同时,如果类定义存在于多个文件中,它们必须保持一致。所以,类定义一般放在头文件中。如果头文件更新了,包含头文件的源文件必须重新编译。
 
  • C++
  • 数组运算符
    目录