• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    6年前 (2013-04-15)  C++ |   10 条评论  6 
    文章评分 0 次,平均分 0.0

    问题

    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改变后的值。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/645.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享