C和C++中的const

一、C语言和C++中的const

const 在 C 语言中是只读变量,总是占用存储空间。C 编译器不能把它看成一个编译期的常量,所以把它用于数组定义时的大小会出现问题。

C默认const是外部连接。


C++中,一个const不必创建内存空间,C++编译器把这个定义保存在它的符号表里。C++默认const是内部连接。

有些情况下,C++还是会为const常量创建内存空间,比如把它定义成extern、取其地址等。


二、能否间接修改const变量

1.C语言例子

const int i=10; 
int *p=(int *)(&i); 
*p=20; 
printf("i=%d *p=%d \n",i,*p); 
输出 i=20 *p=20 

2.C++与const内置类型常量

const int i=10; 
int *p=const_cast<int *>(&i); 
*p=20; 

cout<<"i="<<i<<" *p="<<*p<<endl; 
输出结果是 i=10 *p=20

3.C++与const自定义类型变量

struct test{ 
  int j; 
  char tmp; 
  test() 
  { 
    j=30; 
    tmp='a'; 
  } 
}; 
int main(int argc, char* argv[]) 
{ 
  const struct test t1; 
  int *q=(int *)(&t1.j); 
  *q=40; 
  cout<<"j="<<t1.j<<" *q="<<*q<<endl; 
  return 0; 
} 
输出结果是 j=40 *q=40 

4.示例结果分析 
看到上面三组输出结果,有没有感到很诡异: 
问题1,对于const int类型的变量i,C语言中通过指针p修改了值后,i变成了20;而在C++中,通过指针p修改了值后,i仍然是10。 
问题2,C++语言中 const struct test的元素j通过指针q被改变了,为何const int 与 const struct test的反应机制不同? 

针对问题1,我们知道C语言中const表示只读的变量,既然把const看成是变量,那么其在内存中就会有存储他的空间,并且可以通过指针间接的改变该内存空间的值,当通过指针p改变该内存中的值后,再获取i的值的时候,会访问该空间,得到的是被改变后的值。而C++把const看做常量,编译器会使用常数直接替换掉对i的引用,例如cout<<i; 会理解成cout<<10; 并不会去访问i的内存地址去取数据,这里有点像是C语言里的宏#define i 10。因此C++里i会输出10,而*p会输出20. 

针对问题2,C++语言中只是对于内置数据类型做常数替换,而对于像结构体这样的非内置数据类型则不会。因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值,因此会造成与C++中const int类型完全不一样的处理模式。 

猜你喜欢

转载自blog.csdn.net/buxizhizhou530/article/details/48435729
今日推荐