const在c和c++中的用法

下面只是针对于基本类型

对于标准C来说:const修饰的变量是只读变量,会分配内存空间。但是不能作为左值直接改变。可以通过指针来改变

对于现代C编译器来说:会做一些优化,会进入符号表。如果有对内存的操作出现,那么它就不会去符号表取值,而是去内存中取值。这个和C++进入符号表有些不同。

对于C++来说:const int a=1;会进入符号表,就算给它分配了空间也不会去内存空间去取值。如果加上volatile 就会成为只读变量,和C一样了。

C++中其他const只读变量的情况:

const int& a=1;//a是只读变量

int b=1;const int a =b;//a是只读变量

const int b=1;const int& a=b;//a是只读变量,而b会进入符号表。

等等情况;

我对只读变量的理解(在C++中):

不但要分配空间,还要去内存取值。不能作为左值直接改变,可以用指针和引用改变。

 

1,c语言

const修饰的变量是只读变量,不能作为左值,不能直接赋值,但是可以通过指针去改变该变量的值

(有的书上说会进入符号表,可能编译器的不同)

 

2,C++

a,const修饰的是常量,会进入符号表。但是可能会分配存储空间,只是没有去内存中取值而已,下面就是这个情况。

 

下面是引用的情况

b,加volatile修饰 就会成为只读变量。与上面的程序就只是一个volatile区别

 

下面是引用的情况

 

c,当使用字面量对const引用进行初始化时,C++编译器会为常量值分配空间,是只读变量

 

指针不能指向引用,所以没有指针的情况

d,使用其它变量初始化的const常量仍然是只读变量

 

引用情况

 

e,const引用的类型与初始化变量的类型

相同:

 

不同:生成一个新的只读变量,其初始值与初始化变量相同

 

综合例子:

int main(int argc, char *argv[])

{

const int x = 1;

const int& rx = x;//x分配了内存,只是不能再内存里去值,rx是只读变量

int& nrx = const_cast<int&>(rx);//此时rx还是只读变量

nrx = 5;

printf("x = %d\n", x);//1

printf("rx = %d\n", rx);//5

printf("nrx = %d\n", nrx);//5

printf("x = %p\n", &x);

printf("rx = %p\n", &rx);

printf("nrx = %p\n", &nrx);

 

volatile const int y = 2;//退化为只读变量

int* p = NULL;

 

p = const_cast<int*>(&y);

*p = 6;

 

printf("y = %d\n", y);//6

printf("*p = %d\n", *p);//6

const int z = y;

 

p = const_cast<int*>(&z);

*p = 7;

 

printf("z = %d\n", z);//7

printf("*p = %d\n", *p);//7

 

char c = 'c';

char& rc = c;

const int& trc = c;//trc为新的只读变量 他的值和初始化变量值一样

rc = 'a';

printf("c = %c\n", c);//a

printf("rc = %c\n", rc);//a

printf("trc = %c\n", trc);//c

return 0;

}

 

还要啰嗦几句:

只有字面量初始化const常量才会进入符号表, 不管他以后分不分配空间。const int a=1;

 

只要对const修饰的常量进行了 取地址 或者取引用,都会分配空间。但是不一定会去里面取值

 

对const修饰的常量进行了 取地址 或者取引用 一定要进行强制类型转换 。特别是赋值给普通指针或者普通引用时候,不强制类型转换就会出错。因为 非常指针或非常引用不能指向常量或者引用常量。

 

以上是我见解,可能有不严谨的地方,请多指教。在dev c++中测试

const 在类类型中还有很多知识点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值