常量是一种标识符,它的值在运行期间恒定不变。C语言用 #define来定义常量(称为宏常量)。C++ 语言除了 #define外还可以用const来定义常量(称为const常量)。
1 为什么需要常量
如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
(1) 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。
(2) 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
(3) 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。
l 【规则5-1-1】 尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。
例如:
#define MAX 100 /* C语言的宏常量 */
const int MAX = 100; // C++ 语言的const常量
const float PI = 3.14159; // C++ 语言的const常量
2 const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
l 【规则5-2-1】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
3 常量定义规则
l 【规则5-3-1】需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量集中存放在一个公共的头文件中。
l 【规则5-3-2】如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。
例如:
const float RADIUS = 100;
const float DIAMETER = RADIUS * 2;
4 类中的常量
有时我们希望某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是我们所期望的。const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。
不能在类声明中初始化const数据成员。以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。
class A
{…
const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
int array[SIZE]; // 错误,未知的SIZE
};
const数据成员的初始化只能在类构造函数的初始化表中进行,例如
class A
{…
A(int size); // 构造函数
const int SIZE ;
};
A::A(int size) : SIZE(size) // 构造函数的初始化表
{
…
}
A a(100); // 对象 a 的SIZE值为100
A b(200); // 对象 b 的SIZE值为200
怎样才能建立在整个类中都恒定的常量呢?别指望const数据成员了,应该用类中的枚举常量来实现。例如
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值。枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。
分享到:
相关推荐
一部不可多得的,教你如何设计出高质量的C、C++程序的教材,帮助你在学习和工作中脱颖而出。
目 录 第1章 文件结构 5 1.1 版权和版本的声明 5 1.2 头文件的结构 6 1.3 定义文件的结构 7 1.4 头文件的作用 7 1.5 目录结构 8 第2章 程序的版式 9 2.1 空行 9 ...附录C :C++/C试题的答案与评分标准 91
本书对Oracle的WebDB 的基本概念、结构、组件,利用WebDB 创建应用程序系统和Web 站点,以及管理和维护WebDB 安全性等内容进行了详细介绍。如果喜欢请购买正版图书,请不要把此书用作任何商业用途。
第1章 文件结构<br/>第2章 程序的版式<br/>第3章 命名规则<br/>第4章 表达式和基本语句<br/>第5章 常量<br/>第6章 函数设计<br/>第7章 内存管理<br/>第8章 C++函数的高级特性<br/>第9章 类的构造函数、析构函数与...
高质量C/C++编程指南.PDF 作者:林锐 目录: 前 言 第1章 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2章 程序的版式 2.1 空行 2.2 代码行 2.3 代码行内...
本书主要探讨如何编写出高质量、高水平的C/C++代码,对于在平常编写代码的过程中容易放的错误进行了归纳、总结;同时也提出了如何避免类似错误发生和应对方法。 书中主要涉及到文件结构、程序板式、命名规则、表达式...
常量指针是指--指向常量的指针,顾名思义,就是指针指向的是常量,即,它不能指向变量,它指向的内容不能被改变,不能通过指针来修改它指向的内容,但是指针自身不是常量,它自身的值可以改变,从而指向另一个常量。
vscode配色插件的c/c++语法高亮配置文件,主题插件为C/C++ Themes。 可以对诸如const、enum、typedef别名、结构体引用等语法高亮进行设置,语言本身的关键字自然不用说了,比one dark pro等热门的插件颜色丰富的多。...
目 录 前 言6 第1 章 文件结构 1.1 版权和版本的声明. 1.2 头文件的结构. 1.3 定义文件的结构. 1.4 头文件的作用. 1.5 目录结构. 第2 章 程序的版式 2.1 空行. ...附录C :C++/C 试题的答案与评分标准.
C/C++中常量修饰const可以用来保证一些确定的量不会被一不小心改变,比如PI,一直是3.14159…… 但是不排除有时候也会需要修改常量的值,通过直接修改是不能达到目的。 比如: #include int main(int argc...
第1 章 文件结构;...第5 章 常量; 第6 章 函数设计; 第7 章 内存管理; 第8 章 C++函数的高级特性; 第9 章 类的构造函数、析构函数与赋值函数; 第10 章 类的继承与组合; 第11 章 其它编程经验;
本书论述高质量软件开发方法与C++/C编程规范共十五章,分两部分: 第一部分共四章,重点介绍软件质量和面向对象程序设计方法。 第二部分共十一章,重点阐述C++/C编程风格和一些技术专题。 本书以幽默的笔调对软件...
目 录 第一部分 综述 第一章 高质量软件开发之道 第二章 做好程序员 第三章 编程语言发展简史 第四章 C++面向对象程序设计方法概述 第二部分 C++/C编程规范 第五章 文件结构 ...附录 C:C++/C 代码审查表
前 言...................................................................................... 5.3 常量定义规则..................................................................................................
首先提问,阅读以下C语言程序段,并写出结果: 代码: printf("8 %% -3 = %d\r\n", 8 % -3); printf("-8 %% -3 = %d\r\n", -8 % -3); printf("-8 %% 3 = %d\r\n", -8 % 3); 如果你的回答是: a % b = 2 a % b = -2 ...