C与C++中const区别其实很大

2013年4月15日 由 Creater 留言 »

问题

ques

C语言以及C++语言中的const有什么不同呢?

问题分析
对于声明为const的内置类型,例如int,short,long等等,编译器会如何实现const?那么对于非内置类型是否也是与内置数据类型一样处理呢,例如对于结构体类型则会怎样处理呢?

简单的说const在C语言中表示只读的变量,而在C++语言中表示常量

先看C语言里的const修饰内置类型

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
	const int i = 10;
	int *p = (int*)&i;
	*p = 20;
	printf("i = %d,*p = %d\n", i, *p);
	return 0;
}

答案是:i = 20,*p = 20
这个很好理解,因为i是const的变量,即i不能被修改。这个i还是占用了内存空间,这个内存空间是可以通过其他方式被修改,就像这里通过指针修改。

看C++代码

#include <iostream>
using namespace std;

int main()
{
	const int i = 10;
	int *p = const_cast<int*>(&i);
	*p = 20;
	cout<<"i = "<<i<<", *p = "<<*p<<endl;
	return 0;
}

这里为什么需要弄个const_cast,因为C++中取回的地址是根据当前变量定义来决定的。比如是const类型的变量,则取地址后也是指向const的指针,这与C语言不同。
(gdb) p &i
$2 = (const int *) 0xbffff328
可以看出
然而p的值呢?
(gdb) p p
$3 = (int *) 0xbffff328
结果为i = 10, *p = 20的原因:C++中对于const 修饰内置类型,会直接将其替换,有点类似与#define。

再看

#include <iostream>
using namespace std;

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
为什么同样是C++代码,内置类型和我们自定义类型的差别这么大呢?
C++语言中只是对于内置数据类型做常数替换,而对于像结构体与类这样的非内置数据类型则不会。因为结构体或类类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值。

广告位

发表评论

你必须 登陆 方可发表评论.