1 const与#define的区别
- #define是预处理器选项,可能会不被认为是语言的一部分–在预处理阶段就完成了变量名的替换. const是编译器可见的,其占存储空间,位于符号表(symbol table)而不是内存. 在调试时可以"追根朔源".
- 相较于#define,const更节省内存,其只有一份备份.而#define在程序预处理时,会将程序段中的所有宏进行替换,造成由多处复制品#define.
- const变量位于符号表中,所以免去了读取内存的时间,效率更高.
- const更安全.
2 const对于指针
分辨常量指针与常指针的方法是: 看const位于 * 的哪里,左边就是常量指针,右边就是常指针
E.g.:
/*这两种都是常量指针,注意*运算符与const的位置关系*/
const int* p = 5;
int const* p = 5;
/*这种是常指针,注意*运算符与const的位置关系*/
int* const p = 5;
/*这种是常量指针+常指针,注意*运算符与const的位置关系*/
const char* const str = "hello char*";
cosnt std::string const str = "hello string" //使用string更好
在C++里,字符串尽量选用string, 要比char*更好
3 const对于class
普通成员变量使用const定义,构造函数要用初始化表进行初始化.
3.1 对于静态成员static:
- 首先需要明确: 静态成员与普通成员不同,其占用内存空间,在class还没有实例化对象时,就已经存在了,因此类的static成员的声明在类内,初始化(定义)一般在类的外部.
class A{
private:
static int a; //声明
}
int A::a = 5 //定义
- 1的特例:在C++11以后新的编译器支持: 如果类内的static是个整形变量(int, bool, char)则可以在类内声明.
class A{
private:
static int a = 5;
}
- 静态成员static加入const之后,新编译器允许对整型变量完成内类声明,而无需定义式.