C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
在内存的分配方面,const常量只在第一次使用时分配内存,但是#define却是每次使用的时候都分配一次内存
一. const 与 指针
- char *p = "Hello"; // 非const指针,// 非const数据
- const char *p = "Hello"; // 非const指针,// const数据(指向的内容不可以改变)
- char * const p = "Hello"; // const指针(指向的地址不能改变),,// 非const数据
- const char * const p = "Hello"; // const指针,// const数据
一般来说,你可以在头脑里画一条垂直线穿过指针声明中的星号(*)位置,如果const出现在线的左边,指针指向的数据为常量;如果const出现在线的右边,指针本身为常量;如果const在线的两边都出现,二者都是常量。
二. const 变量的初始化
在类中使用const数据成员只能在构造函数的初始化列表中初始化(对于vc编译器)
class myclass
{
private:
const int count;//如果使用const int count=10;是错误的
public:
myclass();
void print(void);
};
myclass::myclass():count(15)//const数据成员只能在这个初始化列表中进行,父类数据也是在这里初始化(真正意义的初始化的地方)
三. const 与成员函数
1. const放在函数末尾是表示"调用"该方法的"对象实体"在这个方法过程中没有改变,那么我们在这样的函数内"只能"使用const类型的方法或数据.
2. const放在返回值位置的时候表示返回值类型是不可以改变的
四. const 与函数参数
const 修饰函数参数,是为了保证传入的数据在该函数内不会被改变。