在C++中const和static因为用法比较类似,所以很多人认为两只之间存在什么关系,其实他们两个之间没有半毛钱的关系!但是这个问题却是面试过程中经常会被问到的问题之一,下面我们就来看一下他们的区别吧。
const
- C++中const用来定义常量
常量不能做左值被修改,而且常量必须初始化 - const常量初始化值为明确的值
在程序编译阶段被初始值替换,无法通过间接访问修改。代码如下:
int main()
{
const int a = 10;
int *p = (int *)&a;
*p = 20;
cout << a << endl;
return 0;
}
运行结果依旧是10,而不是20,如下图:
- const定义常变量
常变量不可以作左值,不能定义数组大小,在程序编译阶段不发生初始值替换,其余性质与普通变量相同。 代码如下:
int main()
{
int x = 10;
const int a = x;
int *p = (int *)&a;
*p = 20;
cout << a << endl;
return 0;
}
这时候,运行结果将不再是10,而是20,因为a是常变量,结果如下图:
4. const修饰成员方法
将普通成员方法转为常方法,常方法只能访问成员变量不能修改成员变量
5. const修饰成员变量
将成员变量转为常成员变量,其初始化必须写在构造函数的初始化列表中
说完const我们再来看看static
static
- static修饰全局变量
使其从global符号变为local符号,只能在当前文件可见,不参与链接符号解析过程。所以同一个项目中不同文件中可以定义同名的static全局变量而不产生重复定义的错误 - static修饰局部变量
使其从text代码段上的指令变为.data段或.bss段的数据,程序运行时为其分配内存,调用点做初始化,程序结束时内存才会释放,从而延长了其生存周期 - static修饰普通函数
与全局变量相同,使其从global符号变为local符号,只能当前文件可见,不参与链接符号解析过程; - static修饰成员方法
使其从普通的成员方法变为静态成员方法,调用约定cdcel调用约定,形参不再生成this指针,不再依赖对象调用,但可以用类作用域调用 - static修饰成员变量
使其成为静态成员变量,静态成员变量不属于对象,而是属于类,所以必须在类外做初始化,内存变为.data或.bss,不依赖对象访问,可以用类作用域访问,等同于类作用域下的全局变量