1、C++中const有什么用?
不要一听到const就说是常量,这样给考官一种在和一个外行交谈的感觉。应该说const修饰的内容不可改变就行了, 定义常量只是一种使用方式而已,还有const参数, const数据成员, const成员函数,const返回值等, 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。(参考:http://jingyan.baidu.com/article/c45ad29cfc4a6f051753e2c7.html)
另外,使用const对象可以提高程序的可读性与可维护性。
2、何处用到const限定符?
定义常量、const参数、const数据成员、const成员函数、const返回值。
(1) 定义常量:定义const常量只是const的一种使用方式而已。定义const常量时注意:(1)定义时必须初始化,定义之后就不能被修改;(2)const对象默认为文件的局部变量,在其他文件使用时需要在定义时用extern修饰。
(2) const参数:非引用形参(指针形参、const形参)、引用形参(const引用形参比非const引用形参更加灵活)。
(3) const返回值:返回引用。
(4) const数据成员:const修饰类的数据成员,表示成员常量,不能被修改,同时它只能在初始化列表中赋值。
(5) const成员函数:a. const成员函数不被允许修改它所在对象的任何一个数据成员,b. const成员函数能够访问对象的const成员,
(参考:http://blog.csdn.net/Eric_Jo/article/details/4138548;http://bbs.csdn.net/topics/310007610)
3、const、static、const static、static const
常量数据成员:必须在构造函数初始化列表中进行初始化,与类的具体对象相关,不同的对象值可能不同。
静态数据成员:必须在对应的.cpp文件中初始化,不能在类内初始化,与类是相关的,即使没有具体对象也能调用类的静态成员函数与数据成员。
静态常量数据成员:可以在类内进行初始化,也可以在相应的.cpp中初始化,注意:在cpp中给静态常量数据成员变量赋值时,不在需要加static修饰,但const要加,与类和对象相关。
(参考:http://blog.csdn.net/weishan521520/article/details/5897109)
4、const 与指针
int pi = 10;
const int *p; //指向常对象的指针
int* const p = π // 常指针
typedefstring * pstring;
constpstring pi = &s1; //常指针 等价于string * const pi;
(参考:http://www.cnblogs.com/lichkingct/archive/2009/04/21/1440848.html)
5.const 与dedine
C中使用的是宏#define定义常量, C++使用更好的const来定义。
区别:
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。#define不分内存,因为它是预编译指令,编译前进行了宏替换。
const常量会在内存中分配(可以是堆中也可以是栈中)。
(4) const无法代替宏作为卫哨来防止文件的重复包含。
(由于const定义常量从汇编的角度来看,只是给出了对应的内存地址, 而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。)