C\C 中的 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 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的赋值。

以上就是C语言的struct结构体的主要定义方法与赋值,更多的详细内容可以参考 C语言结构体详解http://c.biancheng.net/c/100/


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 中的structclass基本是通用的,有几个不同之处:

> 使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。 > class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C 继承与派生》一章会讲解继承)。 > class 可以使用模板,而 struct 不能(《模板、字符串和异常》一章会讲解模板)。

在编写C 代码时,建议使用 class 来定义类,而使用 struct 来定义结构体,这样做语义更加明确。


其他的一些C 结构体的知识:
[c 结构体] https://www.cnblogs.com/zhengfa-af/p/8144786.html

[c 结构体完全攻略] http://c.biancheng.net/view/1407.html

[c class和struct的区别] http://c.biancheng.net/view/2235.html

(0)

相关推荐

  • c语言学习笔记(八:struct、union、enum、typedef

    自定义数据类型 1.struct 1)结构体的声明 声明结构体变量:结构体所占内存大小是其成员所占内存之和. struct 结构体类型名{//结构体类型名可省略,匿名结构体 成员表://可以有多个成员 ...

  • C/C++ 中 volatile 关键字详解 | 菜鸟教程

    C/C++ 中 volatile 关键字详解 | 菜鸟教程

  • 《伤寒论》中的咳嗽治法详解

    <伤寒论>本论398条中,论及咳嗽的条文计10条13次,涉及到多种病因和多个脏腑. 1.饮邪作祟致咳 饮邪作祟致咳是<伤寒论>论及咳嗽所提到的重要病机.人体水液代谢与肺.脾(胃 ...

  • 古诗词中常见修辞手法详解及鉴赏示例

    修辞手法,是鉴赏诗歌时重点需要鉴赏的对象之一,下文为古诗词中常见修辞手法及鉴赏示例,认真阅读,对诗歌鉴赏定会有所助益. 1.比喻 用一种事物或情景来比作另一种事物或情景.可分为明喻.暗喻.借喻.有突出 ...

  • 字中六合的用法详解, 地支六合如何运用

    地支六合比较复杂,分为合来.合去.合绊,并且还分合吉.合凶,绝非一般的八字命书上说的,看到六合就说好,试想,得病了,是否也是和疾病相合,如何能好,八字中六合的用法详解如下:  1.合来 从字面的意思 ...

  • 什么是从革格?八字格局中从革格详解关于八字命理解析

    什么是从革格?详细了解什么是从革格就得先了解什么是从革,八字命理术语解释中,以金曰从革,从革也就是代表五行中的金,即十天干之庚金与辛金. 八字格局从革格诗诀: 秋月金居一类看.名为从革便相欢. 如无炎 ...

  • 小病大思维:《伤寒论》中的咳嗽治法详解

    [免责声明]图文来源于网络,如有侵权,请联系删除! <伤寒论>本论398条中,论及咳嗽的条文计10条13次,涉及到多种病因和多个脏腑. 1.饮邪作祟致咳 饮邪作祟致咳是<伤寒论> ...

  • 柔中带刚|详解刺鱼,溜鱼,抄鱼在实际做钓中的技巧

    对于野钓来说,我们钓鱼人最终的目的是将鱼从水里钓出来,但是对于能够钓上来还需要一套完整的程序那就是:刺鱼.溜鱼.抄鱼.虽然有时间我们做钓的对象鱼个体都比较小,甚至可以直飞,但是一旦我们遇到大鱼不能直飞 ...

  • 中疾控专家详解哪些症状不能接种新冠疫苗

    中国青年报客户端北京4月11日电(中青报·中青网记者 张曼玉 齐征)有网友反应在疫苗接种现场咽炎.鼻炎.关节炎.高血压.近日吃过药.喝过酒的人接种疫苗时有被"劝退"的情况发生,在国 ...

  • 中医临床实用经验:八髎穴(上、次、中、下髎)详解

    ·1上 髎 [liáo] 穴:小便不利.月经不调.妇科病 上髎穴属足太阳膀胱经,也是膀胱经.胆经的交汇穴:左右双穴,位于骶部,当髂后上棘与中线之间,适对第1骶后孔处.[穴义]膀胱经的地部经水由此从体表 ...