const在c和c++中的用法

下面只是针对于基本类型

我们来看看const这个关键字。

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 在类类型中还有很多知识点。


猜你喜欢

转载自blog.csdn.net/qq_33436509/article/details/79760748