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; //学号
};
注意:各个变量都不能在结构体内初始化,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量实体。

这样就定义了一个新的类型(class)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

原文地址:https://www.cnblogs.com/banluxinshou/p/11823158.html

时间: 2024-11-12 13:40:50

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

Java中的static关键字详解

1.static关键字主要有2个作用: ①为某特定的数据类型或者对象分配单一的存储空间,而与创建对象的个数无关. ②在不创建对象的情况下可以直接通过类名来直接调用方法或者使用类的属性. 2.static主要有4种使用情况:成员变量(属性),成员方法,代码块,和内部类 3.Java中没有全局变量的概念,但是可以通过static来实现全局变量的效果. Java中提供了2种类型的变量:①用static修饰的静态变量②实例变量 他们的区别是静态变量时属于类的,只要静态变量所在的类被加载,就会被分配空间,

javascript 中的 this 关键字详解

1.javascript 中 什么是 this? this 指的是当前行为执行的主体,或者是当前方法执行的主体 context:是当前行为或者方法执行的环境 实例: xx 去北京饭店吃东西:上下文是“北京饭店”, this 是 xx 2. 那么如何判断一个函数在执行的时候,函数体内的 this 关键字是谁呢?主要有以下几条规律:  1)一个函数体内的 this 关键字和这个函数的在哪里定义,哪里执行都没有关系;   2) 判断一个方法执行的时候,函数的执行主体是谁?主要看方法前面有没有点(.),

js中的this关键字详解[转]

本文实例分析了JavaScript中this的用法.分享给大家供大家参考,具体如下: 一."this"公理 this关键字永远都指向函数(方法)的所有者: ? 1 2 3 4 5 6 7 8 9 function fn1(){   this }; fn1(); //this=>window oDiv.onclick=fn1; //this=>oDiv oDiv.onclick=function(){   this //this=>oDiv   fn1(); //thi

Java8中的final关键字详解

final修饰类 当用final去修饰一个类的时候,表示这个类不能被继承. 将类定义成final后,结果只是禁止被继承.由于禁止了继承,所以一个final类中的所有方法都默认为final. 在自己设计一个类的时候,要想好这个类将来是否会被继承,如果可以被继承,则该类不能使用fianl修饰,在这里呢,一般来说工具类我们往往都会设计成为一个fianl类.在JDK中,String被设计为final类型. public final class Feige { public final void say(

js中的this关键字详解

this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, 复制代码 代码如下: function test(){ this.x = 1; } 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面分四种情况,详细讨论this的用法. 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global. 请看下面这段代码,它的运行结果是1.

学习js即时执行函数中的this关键字详解

this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面分四种情况,详细讨论this的用法. 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global. 请看下面这段代码,它的运行结果是1. function te

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

Java中的main()方法详解

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: 1 /** 2 * Java中的main()方法

JS中的event 对象详解

JS中的event 对象详解 JS的event对象 Event属性和方法: 1. type:事件的类型,如onlick中的click: 2. srcElement/target:事件源,就是发生事件的元素: 3. button:声明被按下的鼠标键,整数,1代表左键,2代表右键,4代表中键,如果按下多个键,酒把这些值加起来,所以3就代表左右键同时按下:(firefox中 0代表左键,1代表中间键,2代表右键) 4. clientX/clientY:事件发生的时候,鼠标相对于浏览器窗口可视文档区域的