从 入 门 到 入 土 , 从 出 征 到 出 殡 , 冰 块 萌 兔 带 你 学 习 C + +(7)

今天我们来学习c++入门到入土第七节课——不花钱


上一节课,我们讲到了数组,这节课我们来讲结构体****
我们先来解答一下问题:
1.@王钰宸涵 C语言联合体详解-CSDN博客 给你个资源自己看吧,下一节课会讲解联合体的
2.@黄飞栋 enum是有的C enum(枚举) | 菜鸟教程 给你个资源自己看把
3.@栗子酱 union,我觉得就是省了空间结构体(struct)和联合体(union)的区别_结构体和联合体的区别-CSDN博客 给你个资源自己看吧
4.通知:因寒假就要结束了,所以有时候会一两个月不更新,请谅解



您如有问题的话,可以回复我哦!
我会取前三个问题回答哦

结构体

结构体(struct),可以看做是一系列称为成员元素的组合体。
可以看做是自定义的数据类型。

定义结构体

struct 名字
{
	类型 变量名
	……
	……
	……
} 数组名/指针名/变量名/……(此处不一定要写);

例如:

struct node
{
	int data;
	int flag;
};
const node a;
node b,B[数组长度],c;
node *d;

上例中定义了一个名为 node 的结构体,两个成员元素 data, flag,类型都为 int
} 后,定义了数据类型为 node 的常量 a,变量 b,变量 c,数组 B,指针 d

对于某种已经存在的类型,都可以使用这里的方法进行定义常量、变量、指针、数组等。

定义指针

如果是定义内置类型的指针,则与平常定义指针一样。
如果是定义结构体指针,在定义中使用 StructName* 进行定义。

struct node
{
	/*   ...   */
	node* nxt;
};

上例仅作举例,不必纠结实际意义。

访问/修改成员元素

可以使用 变量名.成员元素名 进行访问。例如可以使用 cout << var.v 来输出 varv 成员。
也可以使用 指针名->成员元素名 或者 使用 (*指针名).成员元素名 进行访问。例如使用 (*ptr).v = tmp 或者 ptr->v = temp 可以将结构体指针 ptr 指向的结构体的成员元素 v 赋值为 temp:。

e## 为什么需要结构体?
首先,条条大路通罗马,可以不使用结构体达到相同的效果。但是结构体能够显式地将成员元素(在算法竞赛中通常是变量)捆绑在一起,如本例中的 node 结构体,便将 data,flag 放在了一起(定义这个结构体的实际意义是表示一个数字的值和是否被选过)。这样的好处边是限制了成员元素的使用。
想象一下,如果不使用结构体而且有两个数组 data[], fall\g[],很容易写混淆。但如果使用结构体,能够减轻出现使用变量错误的几率。
并且不同的结构体(结构体类型,如 node 这个结构体)或者不同的结构体变量(结构体的实例,如上方的 e 数组)可以拥有相同名字的成员元素(如 temp.data,b.data),同名的成员元素相互独立(拥有独自的内存,比如说修改 temp.data 不会影响 b.data 的值)。
这样的好处是可以使用尽可能相同或者相近的变量去描述一个物品。比如说 node 里有 data 这个成员变量;我们还可以定义一个 Car 结构体,同时也拥有 data 这个成员;如果不使用结构体,或许我们就需要定义 dataOFOBJECT[] dataOFJECT[] 等不同名称的数组来区分。

如果想要更详细的描述一种事物,还可以定义成员函数。请参考 获取详细内容。

更多的操作?

详见

注意事项

为了访问内存的效率更高,编译器在处理结构中成员的实际存储情况时,可能会将成员对齐在一定的字节位置,也就意味着结构中有空余的地方。因此,该结构所占用的空间可能大于其中所有成员所占空间的总和。
在定义结构体的时候,千万千万千万千万千万千万千万不要忘记最后的}后要加;,不然就会这样:

image
image

一定要这样:
image

下一节课—— 联合体等等
点赞,点赞,点赞!!!!!!!
球球了!!!!
求求了!!!!

:slight_smile:
QwQ QwQ

4 个赞

我不觉得 structclass 要放在一起.

struct 是从 C 语言过来的, 是基本类型的组合, 我认为应该看成一种集合.
class 是完全从 C++ 来的, 是描述一种对象的属性, 行为的东西, 它应该看成单独的类型.

@jhxs411 这一节课的stuct不同于C中的struct ,在 C++ 中 struct 被扩展为类似class的类说明符。
而且我也没说 structclass 要放在一起.

struct好像可以重载运算符,比如这样:

struct node{
    string name;
    int id,score;
    bool operator<(const node x) const{
        if(x.score==this->score)return x.id<this->id;
        return x.score<this->score;
    }
}a[114514];

是的

我的意思是指, struct 的参考部分可以看 class 的, 但在大体上, struct 的意义与 class 不同, "更多的操作"一栏不应该直接引用类的.

struct node
{
    string name;
    int id, score;
    bool friend operator < (const node x) const
    {
        if (x.score == this->score)
        {
            return x.id < this -> id;
        }
    }
}a[114514];

也可以加friend

@jhxs411 C++struct其实就是 扩展为类似class 的类说明符。
并且类的第一行也说了 类(class)是结构体的拓展,不仅能够拥有成员元素,还拥有成员函数。
在面向对象编程(OOP)中,对象就是类的实例,也就是变量。
C++ 中 struct 关键字定义的也是类,上文中的 结构体 的定义来自 C。因为某些历史原因,C++ 保留并拓展了 struct

那么您说在那一栏中应用什么?

直接写

??

从大山带到深山 :rofl: