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

C\C++中的 struct 关键字详解的更多相关文章

  1. java中的static关键字详解

    static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...

  2. C/C++中的static关键字详解

    C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static.前者应用于普通变量和函数,不涉及类:后者主要说明static在类中的作用.一.面向过程设计中的sta ...

  3. javascript 中的 this 关键字详解

    1.javascript 中 什么是 this? this 指的是当前行为执行的主体,或者是当前方法执行的主体 context:是当前行为或者方法执行的环境 实例: xx 去北京饭店吃东西:上下文是“ ...

  4. java中的transient关键字详解

    目录 1.何谓序列化? 2.为何要序列化? 3.序列化与transient的使用 4.java类中serialVersionUID作用 5.transient关键字小结 前言 说实话学了一段时间jav ...

  5. js中的this关键字详解

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, 复制代码 代码如下: function test(){ this.x = 1; ...

  6. 【转载】C/C++中extern关键字详解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  7. Objective-C中 Self和 Super详解

    Objective-C中 Self和 Super详解 Objective-C 中Self 和 Super 详解本文要介绍的内容,在 Objective-C 中的类实现中经常看到这两个关键字 self  ...

  8. python关键字详解

    今天依旧在啃:<笨方法学python>,其中习题37是复习各种关键字.我本想百度一下记一下就ok了,但是百度出来第一个就Hongten的博客.我才意识到我也有博客,我应该学习他,把这些积累 ...

  9. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

随机推荐

  1. 反射基础 System.Reflection

    一.获取程序集Assembly 1.获取当前运行的程序集 System.Reflection.Assembly[] asm = AppDomain.CurrentDomain.GetAssemblie ...

  2. TreadPool

    ThreadPool概述 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 I/O.代表其他线程等待以及处理计时器. 创建线程需要时间.如果有不同的小任务要完成,就可以事先创建许多线程/在 ...

  3. re模块中的非贪婪匹配

    python的re模块中有贪婪匹配和非贪婪匹配之分,当使用*时会匹配零个或多个,使用+时会匹配一个或多个.当使用?在前边特殊符号前时会进行非贪婪匹配,匹配零个或者一个,今天主要讨论非贪婪匹配中存在的坑 ...

  4. Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) D. Power Products

    链接: https://codeforces.com/contest/1247/problem/D 题意: You are given n positive integers a1,-,an, and ...

  5. 04_Returners组件:返回jobid的结果到mysql

    1.前期调研 0.环境 salt 2019 python3.6  很重要 [root@IP ~]# salt-call --versions-report Salt Version: Salt: 20 ...

  6. rect dict tect 词根助记

    rect: r (跑)e(E 槽子)ct(不停的跑)  就是直的 dict:  d(椅子)i(人)C(开口说)t(T 桌子)  : 椅子前站人 开口说前面是桌子 tect: tt(TT像盖子)EC(E ...

  7. SIGAI深度学习第八集 卷积神经网络2

    讲授Lenet.Alexnet.VGGNet.GoogLeNet等经典的卷积神经网络.Inception模块.小尺度卷积核.1x1卷积核.使用反卷积实现卷积层可视化等. 大纲: LeNet网络 Ale ...

  8. [git]用户名,邮箱

    1.查看当前的用户名,邮箱 git config user.name git config user.email 2. 修改当前用户名,邮箱 git config --global user.name ...

  9. [HNOI2009]最小圈 分数规划 spfa判负环

    [HNOI2009]最小圈 分数规划 spfa判负环 题面 思路难,代码简单. 题目求圈上最小平均值,问题可看为一个0/1规划问题,每个边有\(a[i],b[i]\)两个属性,\(a[i]=w(u,v ...

  10. bus error(总线错误)

    转自 http://blog.csdn.net/todd911/article/details/8813321 在<C专家编程>中提到了总线错误bus error(core dumped) ...