设为首页 加入收藏

TOP

小议C++中const的实现机制
2012-12-06 13:47:39 来源: 作者: 【 】 浏览:318
Tags:小议 const 实现 机制

    问题

    C语言以及C++(www.cppentry.com)语言中的const究竟表示什么 其具体的实现机制又是如何实现的呢 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制.

    问题分析

    简单的说const在C语言中表示只读的变量,而在C++(www.cppentry.com)语言中表示常量.关于const在C与C++(www.cppentry.com)语言中的使用以及更多的区别,以后有时间另开一贴说明.

    那么const究竟是如何实现的呢 对于声明为const的内置类型,例如int,short,long等等,编译器会如何实现const的本意 那么对于非内置类型是否也是与内置数据类型一样处理呢,例如对于结构体类型则会怎样处理呢 下面通过几个小例子来说明这些问题:

    C语言const示例:

    const int i=10;

    int *p=(int *)(&i);

    *p=20;

    printf(“i=%d   *p=%d   \n”,i,*p);

    猜一猜输出结果是什么 i=20 *p=20

    C++(www.cppentry.com)语言const示例1:

    const int i=10;

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

    *p=20;

    cout<<“i=”<<i<<“   *p=”<<*p<<endl;

    输出结果是 i=10 *p=20

    C++(www.cppentry.com)语言const示例2:

    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

    示例结果分析

    看到上面三组输出结果,有没有感到很诡异:

    问题1,对于const int类型的变量i,C语言中通过指针p修改了值后,i变成了20;而在C++(www.cppentry.com)中,通过指针p修改了值后,i仍然是10.

    问题2,C++(www.cppentry.com)语言中 const struct test的元素j通过指针q被改变了,为何const int 与 const struct test的反应机制不同

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

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

    小结

    C语言与C++(www.cppentry.com)有很多的区别与联系,const只是其中一个方面,对于const的理解和使用是编程(www.cppentry.com)的基础,需要熟练掌握.

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++结构体实例和类实例的初始化 下一篇i2c 驱动编程接口

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: