C++中使用const关键字来修饰常量,下面从两个方面总结:变量和成员函数。
变量:const可以修饰普通变量、指针(数组)和结构体。
1.const修饰普通变量是最简单的情形。这样的用法多为在程序中创建一个只读变量,类似于C语言的#define宏定义,但const声明的变量可以指定类型,因此在C++中提倡使用const关键字声明只读变量。
const int Month = 12; /* 示例代码 1 */
示例代码1表示:定义了一个int型变量Month,程序可以使用该变量,但不可对Month变量重新赋值,如:
int tmp = Month + 3; /* 正确 */ Month = 6; /* 错误 */
2.下面是const修饰指针的情形。这样的情形多见于将指针/数组作为某个函数的参数,为了防止调用该函数时无意或错误修改了原指针数据,常在指针参数前添加const关键字,如:
void ShowMsg(const char *strMsg); /* 示例代码 2 */
示例代码2声明了一个返回值为void的函数ShowMsg,假设该函数的作用是显示某个字符串的内容,我们在使用的时候不希望该函数修改原字符串的内容,因此可以将参数前添加const关键字,这样,如果函数代码中错误出现了修改strMsg字符串的代码,程序编译将会报错。
下面,分四种情况详细叙述const和指针的搭配:
/* 示例代码 3 */ int a = 10; const int *pB = &a; /* 1 */ int const *pB = &a; /* 2 */ int * const pB = &a; /* 3 */ const int * const pB = &a; /* 4 */
请看示例代码3中的四种情形,我们可以这样来记忆:const位于星号左侧表示指针指向的变量为常值,上述1、2两种情况的作用一样,指针变量指向的值为常值,不可使用指针变量pB来修改该值,换句话说,*pB的值为const不可修改,即不可执行*pB = 11;(但是a = 11是合法的,int b = 11;pB = &b 也是合法的)。注意:可以将const变量的地址赋给const指针(如示例3),但不可将const变量的地址赋给非const指针。如以下代码是非法的:
/* 错误代码示例 */
const int a = 10; int *p = &a;
const位于星号右侧表示是一个常量指针,该指针地址不可被修改。3表示pB只可指向&a地址,但可以使用*pB = 11来改变a的值。4是以上两种情况的综合。
3.使用const修饰函数一般出现在成员函数中,如下形式:
/* 示例代码4 */
class Demo { private: ......
public:
...
void ShowMsg() const; /* 函数声明 */
};
像示例代码4中那样声明的函数称为const成员函数,该函数不会修改类对象,即不会对类的私有成员变量进行改动。