CC++中的struct关键字详解
struct关键字是⽤来定义⼀个新的类型,这个新类型⾥⾯可以包含各种其他类型,称为结构体。
1. 什么是结构体
结构体(struct)是⼀种⾃定义的数据类型,就是把⼀组需要在⼀起使⽤的数据元素组合成⼀个新的类型。结构体的作⽤就是封装,以⽅便地使⽤这些封装到⼀起的属性。
新的类型与C++中基本类型int,库类型string⼀样。C++的关键字struct是从C语⾔中的struct继承过来的,它们之间有区别与联系。
2. C语⾔的struct:
C语⾔可以使⽤结构体struct来存放⼀组不同类型的数据,在C语⾔中结构体只能包含变量,不能包含函数,定义格式为:
struct 结构体名{
结构体所包含的变量;
};
在定义结构体时,不能在结构体内初始化包含的那些变量,因为结构体声明只是创建⼀个新的数据类型,还不存在这种类型的变量实体。
>> 注意:花括号{}后⾯的分号';'不可缺少,因为它是⼀条定义语句。
例如,我们想定义⼀个与学⽣考试成绩有关的数据结构类型,⽅便我们的管理,那么新类型所包含的应该有学⽣的名称,年龄,学号等信息,可以写为如下:
struct Student{
char *name; //姓名
int age; //年龄
int school_id; //学号
};
注意:各个变量都不能在结构体内初始化,因为结构体声明只是创建⼀个新的数据类型,还不存在这
种类型的变量实体。
这样就定义了⼀个新的类型Student,与基本类型int,double或者库类型string⼀样,可以⽤这个新类型去定义变量。⽐如我们定义⼀个整型变量,定义⼀个双精度浮点数,再定义2个学⽣信息,
int a = 0;
double b = 1.0;
//C语⾔要求结构体在定义变量时要加上 struct Student
c语言struct头文件struct Student xiaoming("xiaoming", 10, 10001), jim('jim', 9, 10002); //直接在定义变量 xiaoming,jim 时提供赋值
或者定义变量时不提供初始值,后续再逐个给变量的成员赋值,如下:
struct Student xiaoming, jim;  //定义了两个变量 xiaoming,jim
xiaoming.name = "xiaoming";
xiaoming.age = 10;
xiaoming.school_id = 10001;
...
还有2种⽅式给结构体类型Student定义变量,如下,
第⼀种:将变量放在结构体定义的最后即可。同时也可以提供赋值。
struct Student{
char *name; //姓名
int age; //年龄
int school_id; //学号
}xiaoming, jim = {"jim", 9, 10002}; //将变量放在结构体定义的最后即可(⼤括号之后、分号之前)。同时也可以提供赋值。
第⼆种:
如果只需要 `xiaoming`, `jim` 两个变量,后⾯不需要再使⽤该结构体的名称去定义其他变量,那么在定义时也可以不给出结构体名称。
这样做省略了结构体的名称,书写简单,但是因为没有结构体名,后⾯就没法⽤该结构体定义新的变量。如下所⽰:
struct {
char *name; //姓名
int age; //年龄
int school_id; //学号
}xiaoming, jim = {"jim", 9, 10002}; //省略了结构体的名称,后续就⽆法再⽤此结构体定义变量。
使⽤结构体内定义的成员时,通过点号.操作,例如,
xiaoming.name = "xiaoming";
xiaoming.age = 12;
就完成了对变量xiaoming的name与age的赋值。
3. C++的struct
C++的关键字struct是从C语⾔中的struct继承过来的,但是与C语⾔中要求struct只能包含成员变量不⼀样。C++中,struct类似于class,既可以包含成员变量,⼜可以包含成员函数。
C++的struct与C语⾔的不同之处有:
1.C++的结构体在定义变量时,结构体名称的前⾯可以省略struct,例如定义了Student结构体类型,
struct Student{
char *name; //姓名
int age; //年龄
int school_id; //学号
};
在定义结构体时,不能在结构体内初始化包含的那些变量,因为结构体声明只是创建⼀个新的数据类型,还不存在这种类型的变量实体。
Student xiaoming, jim; //C++允许省略struct,在Student前⾯可以不加struct。定义结构体Student类型的变量xiaoming,jim。
struct Student xiaoming, jim; //C风格的变量定义,在C++⾥⾯也没有问题,兼容。
2.结构体的初始化:使⽤初始化列表或构造函数
初始化列表的⽅式初始化:
Student stu1 = {"James",  15,  20190101};
这就定义了⼀个Student类型的变量stu1,并且以列表的形式为其中的变量提供了初始值。
除了使⽤初始化列表之外,C++中还可以使⽤构造函数来初始化结构体成员变量,这和初始化类class成员变量是相同的。
与类class的构造函数⼀样,结构体的构造函数必须是与结构体名称相同的公共成员函数,并且没有返回类型。因为默认情况下,所有结构体成员都是公开的,所以不需要使⽤关键字 public。
初始化构造函数的⽰例,
struct Student{
char *name; //姓名
int age; //年龄
int school_id; //学号
//初始化构造函数名称与结构体名称相同,且⽆返回值。默认的初始化。
Student( /* args */ ){
name = "test";
age = 100;
school_id = 000001;
}
};
虽然结构体可以包含成员函数,但尽量不要这样做。尽量只把结构体当作数据类型,⽽在类class⾥⾯使⽤成员函数。
C++中的struct和class基本是通⽤的,有⼏个不同之处:
> 使⽤ class 时,类中的成员默认都是 private 属性的;⽽使⽤ struct 时,结构体中的成员默认都是 public 属性的。
> class 继承默认是 private 继承,⽽ struct 继承默认是 public 继承(《C++继承与派⽣》⼀章会讲解继承)。
> class 可以使⽤模板,⽽ struct 不能(《模板、字符串和异常》⼀章会讲解模板)。
在编写C++代码时,建议使⽤class来定义类,⽽使⽤struct来定义结构体,这样做语义更加明确。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。