“static const” vs “#define” vs “enum” ?
“static const”
“static const” 基本上是 static(存储说明符)和 const(类型限定符)的组合。
static 决定变量的生命周期和可见性/可访问性。这意味着,如果一个变量被声明为静态变量,它将在程序运行的整个时间内保留在内存中,而普通的或自动变量在函数(变量定义所在的位置)结束时会被销毁。
const 是一个类型限定符。类型限定符用于通过类型系统表达有关值的附加信息。当使用 const 类型限定符初始化变量时,它将不再接受值的更改。
因此,结合 static 和 const,我们可以说,当使用 static const 初始化变量时,它将保留其值直到程序执行结束,并且它也不会接受任何值的更改。
示例
#include<iostream> using namespace std; int main(){ int input = 10; static const int value = 5; input += value; cout << input; return 0; }
“#define”
预处理器命令称为指令,以井号或哈希符号 (#) 开头。井号 (#) 前不应出现空格,末尾不需要分号。
预处理阶段可以执行许多操作,包括:
通过 #include 指令包含其他文件
通过 #define 指令定义符号常量和宏
通过一些预处理器指令,您还可以有条件地编译或执行一些预处理器指令。
注意 - C++ 程序的预处理阶段发生在程序编译之前。C++ 预处理器是在编译源代码之前执行的程序。
您已经学习了如何使用 #include 预处理器指令在程序中包含所需的标头文件。本讨论专门针对 #define 预处理器指令。
#define 预处理器允许我们定义符号名称和常量。例如:
#define PI 3.14159
此语句将程序中 PI 的每次出现都转换为 3.14159。
C++ #define 示例
现在考虑一个完整的示例,其中 PI 的每次出现都将替换为 3.14159,该值由 #define 指令定义。
Input: PI 3.14159 Output: Area of Circle 314.15
示例
#include<iostream> using namespace std; #define PI 3.14159 int main() { int r = 10; float cir; cir = PI * (r * r); cout<<"Area of Circle: "<<cir<<endl; }
“enum”
enum 是用户定义的数据类型,我们为变量指定一组值,并且变量只能取一小组可能值中的一个。我们使用 enum 关键字来定义枚举。
enum direction {East, West, North, South}dir;
这里的枚举名称是 direction,它只能取四个指定值中的一个,声明末尾的 dir 是一个枚举变量。
让我们来看一个简单的例子来理解这一点
在这里,我将值 West 赋值给枚举变量 dir,当我显示 dir 的值时,它显示 1。这是因为默认情况下,值按从 0 开始的递增顺序排列,这意味着 East 是 0,West 是 1,North 是 2,South 是 3。
Input: direction {East, West, North, South} dir=West Output: 1
示例
#include<iostream> using namespace std; enum direction {East, West, North, South} dir; int main(){ dir = West; cout<<dir; return 0; }
另一种声明枚举变量的方法
正如我们在上面的例子中看到的,我已经在枚举声明期间声明了枚举变量 dir,还有一种方法可以声明枚举变量。
示例
#include <iostream> using namespace std; enum direction {East, West, North, South}; int main() { direction dir; dir = South; cout<<dir; return 0; }
输出
3
为什么在 C++ 中使用 enum
现在我们了解了什么是 enum 以及如何在程序中使用它们,让我们讨论一下我们为什么要使用它们
只有当我们期望变量具有可能值集之一时才使用枚举,例如,我们有一个保存方向的 dir 变量。由于我们有四个方向,此变量可以取四个值中的任何一个,如果我们尝试为此变量分配另一个随机值,则会引发编译错误。这增加了编译时检查并避免了传递无效常量时发生的错误。
另一个经常使用它们的重要位置是 switch case 语句,其中 case 块期望的所有值都可以在 enum 中定义。这样,我们可以确保传递到 switch 括号中的 enum 变量不会取任何它不应该接受的随机值。