常量是常数或代表固定不变值的名字。
程序中如果想让变量的内容自初始化后一直保持不变,可以定义一个常量。
例如,在圆面积计算中经常要用常数丌,此时,通过命名一个容易理解和记忆的名字来 改进程序的可读性,同时在定义中加关键字const,给它规定为常量性质,以帮助预防程序出错。
如果在整个程序中的许多地方都要用到一个常数,那么,在这些地方的一个或多个地方 写错了这个值就会导致计算错误。 如果给常数取个名字,每处常数都以该名字代替,那么编 译器就能检查名字拼写错误, 避免常数值的不一致性。
丌字符不属于C++语言的字符描述集,不能用来作C++中的名字。我们用pi来表示丌:
const float pi=3.1415926;
由于有效位的限制,在下面常量定义中,最后3位不起作用:
const float pi=3.141592653;
尽管等号后面的常数是double型的,但因为float常量只能存储7位有效位精度的实数,所以pi的实际值为3.141593(最后1位4舍5人)。 如果将常量pi的类型改为double型,则能全部接受上述10位数字。
定义成const后的常量, 程序中对其只能读不能修改,从而可以防止该值被无意地修改。 由于不可修改,所以,常量定义时必须初始化。例如:
const float pi;
pi=3.1415926; //error
常量名不能放在赋值语句的左边。
常量定义中初始化的值可以是一个常量表达式。常量在程序运行之前就已经知道了其值,所以,编译时就能求值。但表达式中不能含有某个函数。例如:
const int size=100 * sizeof(int); //ok
const int number=max(15,23); //error
因为sizeof不是函数, 而是C++的基本操作符,该表达式的值在编译之前能确定,所以第一个常量定义语句合法。第二个语句要求函数值,函数一般都要在程序开始运行时才能求值,该表达式不能在编译之前确定其值,所以是错误的。
一般来说,相同类型的变量和常量在内存中占有相同大小的空间。只不过常量不能通过常量名去修改其所处的内存空间,而变量却可以。
->关于#define
在C中,另一种定义常量的方法是用编译预定义指令(#define)。例如:
#define PI 3.1415926
这条指令的格式是#define后面跟一个常量名再跟一串字符, 中间用空格隔开。由于它不是C++语句,所以行末不用分号。
当程序被编译时,它要先被编译预处理。当预处理遇到#define指令时,就用数值3.1415926替换程序中所有的PI。
尽管它具有常量的所有属性,但是,在编译预处理完成后,PI不属于C++程序中的名字了(全部被字串3.1415926所替代),所以它不是一个具有一定类型的常量名。随后的编译 无法发现由它引起的数据类型误用的错误。
C++容许#define定义常量是为了兼容C,使C程序能在C++编译器中顺利通过。在C++编程中,常量定义都用const,不用#define。