1. 常量
1.1 常量的定义
- 常量:常量是定以后,在程序运行中不能被改变的标识符;
常量:可以用#define 、const这两种方法定义;
(1)#define PRICE 10 //定义常量10 (2)const int price= 10; //定义常量10
1.2 常量的意义:避免程序中出现的魔法数值
魔法数值的程序示例:
for (int i = 0; i < 10; i++) { cout<<i<<endl; }
定义常量的程序示例:
#define COUNT 10 //定义常量10 for (int i = 0; i < COUNT; i++) { cout<<i<<endl; } 或 const int count= 10; //定义常量10 for (int i = 0; i < count; ++i) { cout<<i<<endl; }
注:界限值10是什么,它具有什么含义?在代码中若直接使用类似10这些“魔数”(magic number),这些数字的具体含义就不能体现出来。另外,假如程序中多处包含10这个数,随着时间的推移,发现有些10需要更改为1000,有些10需要保持不变。这种情况下,程序员必须小心谨慎地去一个一个地查找程序中所有的10,并保证更改的数字不会出错——使用“魔数”会导致难以维护的问题。
1.3 #define与const的比较
- #define宏常量:没有数据类型。
#define不涉及为定义的常量做类型检查;
#define本质上是一个预处理器指令,它仅仅表示使用一个串代替别一个串而已,没有类型安全检查,且有时还会产生边际效应(不如你愿处); - const定义常量:有数据类型。
const会检查定义的常量类型;
const定义的常量编译器可以对其进行数据静态类型安全检查; #define与const的程序示例比较
(1)#define宏常量的程序示例:#include <iostream> using namespace std; #define N 100 #define M 200 + N int main() { cout<<"M *N = "<<M*N<<endl; cout<<"200 + N*N = "<<200 + N*N<<endl; system("pause"); return 0; } =>M *N = 10200 200 + N*N = 10200
(2)const定义常量的程序示例:
#include <iostream> using namespace std; const int N = 100; const int M = 200 + N; int main() { cout<<"M *N = "<<M*N<<endl; cout<<"(200 + N)*N = "<<(200 + N)*N<<endl; system("pause"); return 0; } =>M *N = 30000 (200 + N)*N = 30000
(3)const定义常量的程序示例:const检查定的类型
#include <iostream> using namespace std; const float pi = 3.141592653; int main() { cout<<"pi = "<<pi<<endl; system("pause"); return 0; } =>pi = 3.14159
注:const检查定的类型,如 const float pi = 3.141592653,实际的pi是3.141593,因为float类型的有效位限制。
1.4 const与#define相比有何优点
- const定义常量:有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而#define只作简单的字符串替换,无类型安全检查。
- const在编译时分配存储空间,而#define在预编译时编译,不分配存储空间。
- 有些集成化的调试工具可以对const进行调试,但不能对宏进行调试。
注:在C++中,并不提倡使用#define定义一个常量。
1.5 const与#define的作用域比较
- 当定义局部变量时,const作用域仅限于定义局部变量的函数体内。
- 但用#define时其作用域不仅限于定义局部变量的函数体内,而是从定义点到整个程序的结束点。但也可以用#undef取消其定义从而限定其作用域范围。(这是#define的优点)
参考文献:
[1]《C++全方位学习》范磊——第四章
[2]《C++程序设计教程(第二版)》钱能——第二章
[3]《C++Primer(中文版)》王刚 杨巨峰——第二章
[4] 百度搜索关键字:C++常量、魔法数值、const与#define的比较