学如逆水行舟,不进则退
心似平原跑马,易放难收
3.6 什么是常量
定义常量后,就不能修改它的值。在 C++中,给常量赋值会导致编译错误。
在 C++中,常量类似于变量,只是不能修改。与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容。在 C++中,常量可以是:
• 字面常量;
• 使用关键字 const 声明的常量;
• 使用关键字 constexpr 声明的常量表达式( C++11 新增的);
• 使用关键字 enum 声明的枚举常量;
• 使用#define 定义的常量(已摒弃,不推荐)。
3.6.1 字面常量
字面常量可以是任何类型:布尔型、整型、字符串等。
bool b1 = true;
int i2 = 10;
string s3 = "Hello world";
从 C++14 起,您还可使用二进制字面量 。
int someNumber = 0b1010;
在 C++中,您还可定义自己的字面量,如温度 32.0_F(华氏)或 0.0_C(摄氏)、距离16_m(英里)或 10_km(公里)等。
3.6.2 使用 const 将变量声明为常量
从实用和编程的角度看,最重要的 C++常量类型是在变量类型前使用关键字 const 声明的。通用的声明方式类似于下面这样: const type-name constant-name = value;
声明一个名为 pi 的常量 ,代码如下
#include <iostream>
int main()
{
using namespace std;
const double pi = 22.0 / 7;
cout << "The value of constant pi is: " << pi << endl;
// Uncomment next line to view compile failure
// pi = 345;
return 0;
}
结果如下:
The value of constant pi is: 3.14286
**常量是一种确保某些数据不能修改的强大方式。 **
如果变量的值不应改变,就应将其声明为常量,这是一种良好的编程习惯。通过使用关键字 const,程序员可确保数据不变,避免应用程序无意间修改该常量。
在多位程序员合作开发时,这特别有用。
3.6.3 使用 constexpr 定义常量表达式
通过关键字 constexpr,可让常量声明像函数: constexpr double GetPi() {return 22.0 / 7;}
在一个常量表达式中,可使用另一个常量表达式: constexpr double TwicePi() {return 2 * GetPi();}
只要编译器能够从常量表达式计算出常量,就可在语句和表达式中可使用常量的地方使用它。
使用常量表达式来计算 pi 的值 ,代码如下:
#include <iostream>
constexpr double GetPi() { return 22.0 / 7; }
constexpr double TwicePi() { return 2 * GetPi(); }
int main()
{
using namespace std;
const double pi = 22.0 / 7;
cout << "constant pi contains value " << pi << endl;
cout << "constexpr GetPi() returns value " << GetPi() << endl;
cout << "constexpr TwicePi() returns value " << TwicePi() << endl;
return 0;
}
输出如下:
constant pi contains value 3.14286
constexpr GetPi() returns value 3.14286
constexpr TwicePi() returns value 6.28571
常量表达式必须包含简单的实现,并返回简单类型 。
**C++14 中,常量表达式可包含决策结构,如 if 和 switch 语句。 **
**在大多数流行的 C++编译器中,都通过常量 M_PI 提供了精度相当高的 pi 值,您可在程序中使用这个常量,但必须包含头文件。 **
3.6.4 枚举
在有些情况下,变量只能有一组特定的取值。
在这些情况下,需要定义这样一种变量,即其可能取值由您指定。
为此,可使用关键字 enum 来声明枚举。枚举由一组称为枚举量( emumerator)的常量组成。
例如彩虹:
enum RainbowColors
{
Violet = 0,
Indigo,
Blue,
Green,
Yellow,
Orange,
Red
};
基本方位
enum CardinalDirections
{
North,
South,
East,
West
};
可使用枚举来指定变量的类型,这样声明的变量只能取指定的值。 例如:
RainbowColors MyFavoriteColor = Blue; // Initial value
这个变量只能取 RainbowColors中指定的值,而不能取其他值。
编译器将枚举量( Voilet 等)转换为整数,每个枚举量都比前一个大 1。您可以指定起始值,如果没有指定,编译器认为起始值为 0,因此 North 的值为 0。
如果愿意,还可通过初始化显式地给每个枚举量指定值。
使用枚举量指示基本方位 ,代码如下:
#include <iostream>
using namespace std;
enum CardinalDirections
{
North = 25,
South,
East,
West
};
int main()
{
cout << "Displaying directions and their symbolic values" << endl;
cout << "North: " << North << endl;
cout << "South: " << South << endl;
cout << "East: " << East << endl;
cout << "West: " << West << endl;
CardinalDirections windDirection = South;
cout << "Variable windDirection = " << windDirection << endl;
return 0;
}
输出为:
Displaying directions and their symbolic values
North: 25
South: 26
East: 27
West: 28
Variable windDirection = 26
3.6.5 使用#define 定义常量
编写新程序时,不要使用这种常量。