常量,相信大家并不陌生,它是一种标识符,其值在运行中恒定不变。在C中通常会使用#define来定义常量,通常被称为宏常量。而C++除了#define外,还可以使用const来定义。比如:
#define MAX 100 // c语言上的宏常量
const int MIN = 10; // c++
1.使用#define的原因
(1)防止“魔数”的产生,当然可以在程序中使用数字来显示的,但是这会造成他人不理解该数字的含义,使得程序可读性变差。
(2)避免书写错误,假如说程序的多个地方都会使用到该常量,使用数字的话,若造成错误,难免让人很是郁闷啊
2.针对于C++中的关于#define或者const的使用,建议使用const,主要从以下方面考虑:
(1)安全性检查,const常量有数据类型,而宏常量没有数据类型。编译器在会对const常量进行类型检查,而对于#define只是进行替换,所以这样很容易产生意想不到的错误。比如:
#define NUM = 10 + 2
int nNum = NUM * 4; // 会实现你想要的结果吗?
(2)编译效率,之所以加上这方面的原因是在于编译器对代码编译的过程中,含有#define的地方要对其进行替换,这个想想详细了解的,可参考《程序员自我修养》第二章的编译和链接。
(3)方便调试,有些集成工具可以对const进行调试,但是对#define不可进行调试。
3.类常量
由于#define定义的宏常量是全局的,假如我们希望某些常量只在类中有效的话,#define就不能满足需求了,因此可以使用const修饰数据成员来实现。但是要注意,不可在类的声明中初始化数据成员,由于类的对象未被创建,所以这样是错误的,比如:
class AA
{
const int SIZE = 100;
int nNum[SIZE];
};
vs2012编译器会提示:
error C2864: “AA::SIZE”: 只有静态常量整型数据成员才可以在类中初始化
error C2327: “AA::SIZE”: 不是类型名称、静态或枚举数
error C2065: “SIZE”: 未声明的标识符
(看着上面的提示可在const int SIZE前加个static试试,^_^)
所以,正确的方式应该是这样的:
class AA
{
AA(int size);
const int SIZE;
};
AA::AA(int size): SIZE(size)
{
....
}
使用该种方式,大家可以想到,因为类可以创建多个对象,所以对于不同的对象其const数据成员的值也是不同的,比如:
AA a(100); // SIZE 值为100
AA b(200); // SIZE 值为200
但是,如果想在类中建立一个恒定的常量,该如何呢,有两种方法可做参考:
(1)在类中使用枚举常量来实现,比如:
class A
{
enum {SIZE1 = 100, SIZE2 = 200};
int array1[SIZE1];
int array2[SIZE2];
};
枚举常量不会占用对象的存储空间,在编译时会被全部求值。但是其隐含的数据类型是整数,且最大值有限。
(2)使用static,刚才在上面已给大家提示了哈
class A
{
static const int SIZE = 100;
int array[SIZE];
};
使用static使得该常量与其他静态变量存储在一起,而不是存储在对象中,所以该常量被整个类所共享。
若有错误,请大家提示,感谢^_^