C C++中const实在是一个令人头疼的
关键字。
const,顾名思义,就是常的意思,也就是不变的。
用const修饰一个符号值,表示这个量是不变的。
但是!真的是不变的吗?C语言中的const是可以变的!来看下下面这个程序吧:
#include<stdio.h>
int main(){
const int a=10;
int* p=(int*)&a;
*p=100;
printf("%d\n",a);
return 0;
}
如果用GCC来编译上面程序,运行结果是100!如果用G++来编译的话,结果是10.也就是说,C中的const变量是可以通过一定的方式变相改变他的值得,但是C++在这方面做的
比较好,或者说是比较
合理,保持了它字面上的意思,不变!也许就是因为这个原因,C语言在定义数组时才不能用const量来指定数组大小吧。不过我在GCC上试验貌似是可以的,大概是已经根据新的标准编译器进行了改进,这里暂且不去管他吧。
再来看看另外一个区别。我们知道,在
全局文件区域定义一个变量时,可以在另一个文件中使用它,因为他默认是extern的,但是如果加上了const修饰,那么C++中就无法在另一文件直接声明使用了,在程序链接阶段会报错。所以我们需要在定义const变量时显示声明为extern,可导出的。网上还有另外一种写法,即在const前用extern "C" 修饰。
现在来具体详细说说C++中的const吧。已经说了修饰变量,来说说如果修饰指针呢?
其实是一样的,你只要
理解const修饰的到底是指针还是指针指向的值。例如:
const char* s;//s指向的值不变
char* const s;//s指针本身不变,即不能指向其他地址。
char const * s;//同1.
如果const常量在类中,就会有些特殊了。因为类中的变量不能直接赋值,而const却要求变量定义时就有值,那么,这个值就需要在类的
构造函数参数初始化列表中进行赋值,在其他地方都会引起编译器不通过的现象。
普通变量和用const修饰的变量是不同的类型,所以,可以进行const
重载:
void func(const OBJ a){}
void func(OBJ a){}
这两个函数编译器不会报错,因为
他们是属于不同类型。
再来看看const成员函数,也就是在函数参数列表后,函数体开始前加上const进行修饰的函数。可以对成员函数进行const重载。即:
class A{
void func()const{}
void func(){}
}
这样可以编译通过。
我理解这个可以重载的原因是这样的,C++类对象函数中都会默认传入一个this对象,这样,用const修饰就表示this是const的,所以该对象不能改变。
好了,先写到这里,以后看到有新的再补充吧。