C/C++之常量

  常量,相信大家并不陌生,它是一种标识符,其值在运行中恒定不变。在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;    // 会实现你想要的结果吗?

当然使用#define可以提高执行效率,由于宏变量本身不是函数,故省去了函数压栈,生成汇编语言,返回参数,执行return等过程,从而提高速度。但是边际效应不得不让人重视。

 

(2)方便调试,有些集成工具可以对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使得该常量与其他静态变量存储在一起,而不是存储在对象中,所以该常量被整个类所共享。

 

若有错误,请大家提示,感谢^_^

 

posted @ 2015-06-13 00:34  Code~  阅读(617)  评论(0编辑  收藏  举报