1. 结构

1.0 结构

数组是相同类型元素的集合,相反,struct 是任意类型元素的集合。
代码例子:

struct Address {
const char* name;
int number;
const char* street;
const char* town;
}
// 初始化:
Address jd = {"zs", 1, "jd", "t"};
// 赋值
jd.name = "ls";
cout << jd.name << endl;
// 取值
void print_add1(const Address* add)
{
cout << add->name << endl
<< add->number << endl
<< add->street << endl
<< add->town << endl
}
// 如果 add 是一个指针,则 p->m 等价于 (*p).m
// 也可以使用 . 运算符访问它
void print_add2(const Address& add)
{
cout << add.name << endl
<< add.number << endl
<< add.street << endl
<< add.town << endl
}

结构体类型的对象也可以被赋值和作为实参传入函数,或者作为函数的结果返回。

1.1 布局

结构体形式:

struct Readout{
char hour;
int value;
char seq;
} // sizeof() -> 12 struct Readout{
int value;
char hour;
char seq;
} // sizeof() -> 8

内存在为成员分配空间时,顺序与声明结构的时候保持一致,因此,hour 的地址一定在 value 之前。在计算机中,很多机器要求一些特定类型的对象沿着系统结构设定的边界分配空间,以便机器能高效地处理这些对象。上述代码的结构体大小使用sizeof(Readout)计算时,真正的结果为 12。
实际编写过程中可以按照各自的尺寸排序(大的在前面),这样可以在一定程度上减少空间的浪费。

1.1 名字

类型名字一出现即可马上使用,无需等全部声明完成,但是等到 struct 的声明全部完成,才能声明它的对象。

struct Link {
Link* previous; // 正确
Link* successor; // 正确
} struct No_good {
No_good member; // 错误,因为此时编译器无法确定 No_good 的大小
}

多个 struct 相互引用,需要提前声明好 struct 的名字

struct List;
struct Link {
Link* pre;
Link* suc;
Link* member_of;
int data;
}
struct List {
Link* head;
}

1.2 结构与类

struct 是一种 class, 它的成员默认是 public 的。struct 可以包含成员函数,尤其是构造函数。

struct Point
{
int x;
int y;
};
struct Points
{
vector<Point> elem;
Points(Point p0) { elem.push_back(p0); }
Points(Point p0, Point p1) {
elem.push_back(p0);
elem.push_back(p1); }
}; int main()
{
Points x1{ {100,200} };
cout << "Hello Word !" << endl;
}

1.2 结构与数组

同理可以定义数组结构体

struct Point {
int x, y;
}
struct Array {
Point elem[3];
}
int main(){
Array points {{1, 2}, {3, 4}, {5, 6}};
int y2 = points.elem[2].y
}

标准库中的 array 也是一种 struct,与内置数组相比,更加完善。

2. 联合

union 是一种特殊的 struct,它的所有成员都分配在同一地址空间上。因此,一个union 实际占用的空间大小与其最大的成员一样,在同一时刻 union 只能保存一个成员的值。

使用 union 的目的是让数据更紧密,从而提高程序的性能。然而,大多数程序即使使用了 union 也不会提高太多,同时,使用 union 代码容易出错,union 一般最好不要出现在程序中。

enum Type {str, num};
struct Entry {
char *name;
Type t;
char* s; // 如果 t == str,使用 s
int i; // 如果 t == num,使用 i
}

在上述代码中 s 和 i 不可能被同时使用,因此空间浪费掉了。因此可以使用 union 解决上述问题。

union Value {
char* s;
int i;
}
struct Entry {
char* name;
Type t;
Value v; // 如果 t == str,使用 v.s,如果 t == num 使用 v.i
}

3. 枚举

枚举类型用于存放用户指定的一组整数值。
枚举类型分两种

  • enum class 他的枚举值名字位于 enum 的局部作用域内,枚举值不会隐式地转换成其他类型。
  • 普通的 enum 它的枚举值名字与枚举类型本身位于同一个作用域中,枚举值隐式地转换成整数。
    建议使用 enum class
    ### 3.1 enum class
    enum class 限定了作用域的强类型枚举。

函数调用:

enum class Traffic_light {red, yellow, green}
Traffic_light tr = Traffic_light::red;

枚举常用一些整数类型标识,每个枚举值是一个整数,标识某个枚举的类型称为它的基础类型。基础类型必须是一种带符号或无符号的整数类型,默认是 int。
可以显式地指定:
enum class Warning: int {green, yellow, orange, red}
如果你认为上述的定义太浪费控件,可以使用 char 代替 int:
enum class Warning: char {green, yellow, orange, red}

enum Traffic_light
{ tl_red, tl_yellow, tl_green };
enum Warning
{ green, yellow, orange, red };
void f(Traffic_light x)
{
if (x == red)
{
printf("red");
}
if (x == Warning::red)
{
printf("red");
}
}

3.2 普通的 enum

“普通的 enum” 是指 c++ 在指出 enum class 之前提供的枚举类型,在很多 C 和 C++ 的代码中都存在普通的 enum。普通的 enum 的枚举值位于 enum 本身所在的作用域中,它们隐式地转换成某些整数类型的值。

enum Traffic_light { red, yellow, green}

C++ | C++ 基础知识 | 结构、联合与枚举的更多相关文章

  1. C语言基础(19)-结构体,联合体,枚举和typedef

    一.结构体 1.1 结构体struct定义及初始化 #include <stdio.h> // 这个头文件在系统目录下 #include <stdlib.h> // 使用了sy ...

  2. C#基础知识 结构与类的区别

    网上看到struct与class之间的区别,都写的很多,当然说的是对的,也很详细.不过我个人不喜欢照本宣科,还是要有自己的理解和认识,方便记忆. (前提:对于值类型与引用类型有一定的认识) 结构最重要 ...

  3. C#学习笔记(基础知识回顾)之枚举

    一:枚举的含义 枚举是用户定义的整数类型.在声明一个枚举时,要指定该枚举的示例可以包含的一组可接受的值.还可以给值指定易于记忆的名称.个人理解就是为一组整数值赋予意义. 二:枚举的优势 2.1:枚举可 ...

  4. JSP基础知识➣结构及生命周期(一)

    概述 网络服务器需要一个JSP引擎,也就是一个容器来处理JSP页面.容器负责截获对JSP页面的请求.本教程使用内嵌JSP容器的Apache来支持JSP开发. JSP容器与Web服务器协同合作,为JSP ...

  5. C#语言基础——结构体和枚举类型

    结构体和枚举类型 一.结构体(struct) 结构类型是用户自己定义的一种类型,它是由其他类型组合而成的,可包含构造函数.常数.字段.方法.属性.索引器.运算符.事件和嵌套类型的值类型.结构在几个重要 ...

  6. CSS基础知识—【结构、层叠、视觉格式化】

    结构和层叠 选择器的优先级顺序: style[内联元素]选择器>Id选择器>类选择器 属性选择器>元素选择器>通配器选择器 重要性:@important 有这个标记的属性值,优 ...

  7. C#基础知识之类和结构体

    虽然项目中一直在使用类.结构体等类型,仔细琢磨,还真无法系统的说出个所以然.记录一下类.结构体.类和结构体区别 一.类 对于类,大家都特别熟悉.简单的介绍一下类的结构,然后记录一下Class需要注意的 ...

  8. Servlet学习笔记【1】--- 背景和基础知识(CGI、Web服务器发展史、Servlet简介、任务、继承结构)

    本文主要讲Servlet的基础知识和背景知识. 1 CGI简介 CGI(Common Gateway Interface 公共网关接口)是WWW技术中最重要的技术之一,有着不可替代的重要地位.CGI是 ...

  9. C语言基础知识-程序流程结构

    C语言基础知识-程序流程结构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.概述 C语言支持最基本的三种程序运行结构:顺序结构,选择结构,循环结构. 顺序结构:程序按顺序执行, ...

随机推荐

  1. GPU版TensorFlow怎么指定让CPU运行

    由于某些原因GPU版的TensorFlow运行起来会出现一些问题,比如内存溢出等情况.此时我们可以用CPU和系统内存来运行我们的程序. 代码如下: import osos.environ[" ...

  2. 学习java注意的地方

    Java语言拼写上严格区分大小写: 一个Java源文件里可以定义多个Java类,但其中最多只能有一个类被定义成public类: 若源文件中包括了public类,源文件必须和该public类同名: 一个 ...

  3. Laravel基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向

    https://yq.aliyun.com/ziliao/23889 1.Response篇 1.1 基本响应 最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑 ...

  4. Educational Codeforces Round 65 (Rated for Div. 2) E. Range Deleting(思维+coding)

    传送门 参考资料: [1]:https://blog.csdn.net/weixin_43262291/article/details/90271693 题意: 给你一个包含 n 个数的序列 a,并且 ...

  5. CSS 实现单行及多行文字省略

    单行文字省略 很多时候不确定字数限制,但换行可能影响整体设计,这个时候常用就是文字省略加全文字提示了 .dom{ text-overflow: ellipsis; overflow: hidden; ...

  6. mysql 添加索引,ALTER TABLE和CREATE INDEX的区别

    nvicat-->mysql表设计-->创建索引. (1)使用ALTER TABLE语句创建索引,其中包括普通索引.UNIQUE索引和PRIMARY KEY索引3种创建索引的格式: PRI ...

  7. jQuery 工具类函数-使用$.extend()扩展Object对象

    除使用$.extend扩展工具函数外,还可以扩展原有的Object对象,在扩展对象时,两个对象将进行合并,当存在相同属性名时,后者将覆盖前者,调用格式为: $. extend (obj1,obj2,… ...

  8. Linux 内核硬件资源

    一个 ISA 设备可配备有 I/O 端口, 内存区, 和中断线. 尽管 x86 处理器支持 64 KB I/O 端口内存(即, 处理器有 16 条地址线), 一些老 PC 硬 件仅解码最低的 10 位 ...

  9. 螺旋矩阵O(1)根据坐标求值

    传送门 洛谷2239 •题意 从矩阵的左上角(第11行第11列)出发,初始时向右移动: 如果前方是未曾经过的格子,则继续前进,否则右转: 重复上述操作直至经过矩阵中所有格子. 根据经过顺序,在格子中依 ...

  10. Nutch2.3 编译和安装配置

    Nutch2.3 编译和安装配置 [一].介绍 Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫.现在Nutch分为两个版本:1. ...