C++中const与static的区别

在C++中const和static因为用法比较类似,所以很多人认为两只之间存在什么关系,其实他们两个之间没有半毛钱的关系!但是这个问题却是面试过程中经常会被问到的问题之一,下面我们就来看一下他们的区别吧。

const

  1. C++中const用来定义常量
    常量不能做左值被修改,而且常量必须初始化
  2. const常量初始化值为明确的值
    在程序编译阶段被初始值替换,无法通过间接访问修改。代码如下:
int main()
{
	const int a = 10;
	int *p = (int *)&a;
	*p = 20;
	cout << a << endl;
	return 0;
}

运行结果依旧是10,而不是20,如下图:
在这里插入图片描述

  1. 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

  1. static修饰全局变量
    使其从global符号变为local符号,只能在当前文件可见,不参与链接符号解析过程。所以同一个项目中不同文件中可以定义同名的static全局变量而不产生重复定义的错误
  2. static修饰局部变量
    使其从text代码段上的指令变为.data段或.bss段的数据,程序运行时为其分配内存,调用点做初始化,程序结束时内存才会释放,从而延长了其生存周期
  3. static修饰普通函数
    与全局变量相同,使其从global符号变为local符号,只能当前文件可见,不参与链接符号解析过程;
  4. static修饰成员方法
    使其从普通的成员方法变为静态成员方法,调用约定cdcel调用约定,形参不再生成this指针,不再依赖对象调用,但可以用类作用域调用
  5. static修饰成员变量
    使其成为静态成员变量,静态成员变量不属于对象,而是属于类,所以必须在类外做初始化,内存变为.data或.bss,不依赖对象访问,可以用类作用域访问,等同于类作用域下的全局变量
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值