const¶
C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。
ANSI C规定数组定义时长度必须是“常量”(C99标准,数组下标可以用变量来表示),“只读变量”也是不可以的,“常量”不等于“不可变的变量”。但是在C++中,局部数组是可以使用变量作为其长度的。
相关定义¶
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
“只读变量”是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。
const使用的基本形式:
1)const在前面
const int nValue; //int是const
const char *pContent; //char是const, pContent可变
const char * const pContent; //pContent和*pContent都是const
2)const在后面
int const nValue; //nValue是const
char const * pContent; //*pContent是const, pContent可变
char* const pContent; //pContent是const,*pContent可变
char const* const pContent; //pContent和*pContent都是const
一个简单的判断方法:指针运算符*,是从右到左,那么如:char const * pContent,可以理解为char const (* pContent),即* pContent为const,而pContent则是可变的。
int const *p1,p2;
p2是const;(p1)是一整体,因此(*p1)是const,但p1是可变的。int * p1,p2只代表p1是指向整型的指针,要表示p1、p2都是指针是需写成int * p1, p2。所以无论是* const p1,p2还是const * p1,p2,里面的*都是属于p1的。
int const * const p1,p2;
p2是const,是前一个const修饰的,*p1也被前一个const修饰,而p1被后一个const修饰。
int * const p1,p2;
p1是const,(* const p1)是整体,所以const不修饰p2。
指针指向及其指向变量的值的变化,const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为“左定值,右定向”。
const默认修饰左边的内容,如果左边没有东西则修饰其右边的内容
const int *a //const左边没有东西,因此const修饰int,则指针指向的内容不可通过指针修改
int const *a //const左边有东西,因此const修饰int
int* const a //const修饰*,即指针不能改变指向
const int * const a //第一个const修饰int,第二个const修饰*,即指针指向内容不可修改,也不能改变指针指向
提示
若 * 在const左边,不能改变指针指向,*在const右边,不能修改所指的值
const成员只能在构造函数的初始化列表中初始化,如果非要在类中声明处初始化,就要加上static才行,而且初始化的对象必须是整型
C++11 const 成员可以初始化,结构体内部也可以初始化。 但是 static(非const)成员一定只能在类外初始化。
用const常量代替宏定义可以让编译器进行安全性检查 类的const成员函数不能修改类的成员变量,而且一个const类对象只能调用其const成员函数,不能调用非const成员函数 const成员函数与同名、同返回值、同参数列表的非const成员函数属于重载现象