type
status
date
slug
summary
tags
category
icon
password
Property
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,是一种复合数据类型。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。
C++
继承了C
的 struct
,并且加以扩充。在C语言中,结构体不能包含函数。在面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C
中的结构体只能描述一个对象的状态,不能描述一个对象的行为。在C++
中,考虑到C
到C++
过渡的连续性,对结构体进行了扩展,C++
的结构体可以包含函数,这样,C++
的结构体也具有类的功能。在
C++
中,struct
与class
基本是通用的,唯一不同的是:- 如果使用
class
关键字,类中定义的成员变量或成员函数默认都是private
属性的
- 而采用
struct
,结构体中定义的成员变量或成员函数默认都是public
属性的
注:在一般情况下,tag、member-list、variable-list这3部分至少要出现2个
结构声明
结构声明描述了一个结构的组织布局,声明类似下面这样:
该声明并未创建实际的数据对象,只描述了该对象由什么组成。有时把结构声明称为模板,因为它勾勒出结构是如何储存数据的。
关键字
struct
,它表明跟在其后的是一个结构,后面是一个可选的标记,稍后程序中可以使用该标记引用该结构。后面的程序可以这样声明:结构的标记名是可选的。但是,在一处定义结构布局,在另一处定义实际的结构变量,必须使用标记。
如果把结构声明置于一个函数的内部,它的标记就只限于该函数内部使用;如果把结构声明置于函数的外部,那么该声明之后的所有函数都能使用它的标记。
结构变量
结构有两层含义。一层含义是“结构布局”。结构布局告诉编译器如何表示数据,但是它并未让编译器为数据分配空间。下一步是创建一个结构变量,即是结构的另一层含义。
创建结构变量:
编译器执行这行代码便创建了一个结构变量
library
。编译器使用book
模板为该变量分配空间:两个字符串和一个float
类型变量。这些存储空间都与一个名称library
结合在一起在结构变量的声明中,
struct book
所起的作用相当于一般声明中的int
或float
,可以定义两个struct book
类型的变量,或者甚至是指向struct book
类型结构的指针:结构变量
doyle
和panshin
中都包含title
、author
和value
部分。指针ptbook
可以指向doyle
、panshin
或任何其他book
类型的结构变量。从本质上看,book
结构声明创建了一个名为struct book
的新类型。就计算机而言:
换言之,声明结构的过程和定义结构变量的过程可以组合成一个步骤。如下所示,组合后的结构声明和结构变量定义不需要使用结构标记:
然而,如果打算多次使用结构模板,就要使用带标记的形式。或者,使用
typedef
。初始化结构
初始化变量和数组如下:
初始化一个结构变量与初始化数组的语法类似:
使用在一对花括号中括起来的初始化列表进行初始化,各初始化项用逗号分隔。
也可以使用构造函数来初始化结构体成员变量:
访问结构成员
使用结构成员运算符——点(
.
)访问结构中的成员。例如,library.value
即访问library
的value
部分。本质上,.title
、.author
和.value
的作用相当于book
结构的下标。因为结构数据成员是公共的,所以它们可以被直接访问,并且可以像常规变量一样使用
结构数组
声明结构数组和声明其他类型的数组类似。下面是一个声明结构数组的例子:
以上代码把
library
声明为一个内含MAXBKS
个元素的数组。数组的每个元素都是一个book
类型的数组。因此,library[0]
是第1个book
类型的结构变量,library[1]
是第2个book
类型的结构变量。结构体嵌套
一个结构体的实例也可以嵌套在另一个结构体中
指向结构的指针
声明和初始化结构指针
声明结构指针:
首先是关键字
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
变量。同时,如果类定义存在于多个文件中,它们必须保持一致。所以,类定义一般放在头文件中。如果头文件更新了,包含头文件的源文件必须重新编译。