C++ const基础和const符号表机制探究

来源:互联网 发布:深圳网络指尖公司 编辑:程序博客网 时间:2024/06/06 02:00

一、const基础

const修饰的是常量,定义的时候必须初始化,这里只做举例说明

const int a;
int const b;
//以上这两种写法是一样的

const int *c;  //const修饰的是指针所指向的内存空间,不能被修改
int *const d;  //const修饰的是指针变量,即指针变量本身不能被修改
const int *const e;  //指针变量以及其所指向的空间都不能被修改

下面做举例说明:

#include <iostream>typedef struct Teacher{    char name[64];    int age;}Teacher;//指针所指向的内存空间,不能被修改int operatorTeacher01(const Teacher *pT){    //pT->age = 10;//编译错误    return 0;}//指针变量本身不能被修改int operatorTeacher02(Teacher * const pT){    pT->age = 10; //所指向的内存空间可以被修改    //pT = NULL; //编译错误 pT本身不能被修改    return 0;}//指针变量所指向的内存空间和指针变量本身都不可以被修改int operatorTeacher03(const Teacher * const pT){    //pT->age = 10;//编译错误    //pT = NULL;//编译错误    std::cout << "age:" << pT->age;    return 0;}int main(){    //尝试调用operatorTeacher03方法    Teacher t1;    t1.age = 33;    operatorTeacher03(&t1);    return 0;}

用const的好处:
1、指针做函数参数,可以有效的提高代码的可读性,减少bug
2、清楚的分清楚参数的输入和输出特性

以上是const基础

二、const符号表机制探究

1、C语言中的const是一个冒牌货,C++中 const才是一个真正的常量

2、原因分析

 C语言中,定义的const将重新分配一个内存空间
 
 C++中,编译器对const做了特殊处理,将const常量放到符号表中
 
 下例中,p = (int *)&a;对a变量取地址,C++编译器会为a再单独的开辟一块儿内存空间,p就是指向了这块儿内存空间,无论怎么改,也改变不了符号表中对应的值
 
 而当调用a的时候,还是会在符号表中取值,所以做到了真正的不变
 
 而C语言中只是给常量申请了块儿内存空间
 
 所以,C++中可以说是将const变成了真正的const

下面做举例说明

#include <stdio.h>int main(){    //看起来好像a是一个常量,其实不然    const int a = 10;    //a = 11;    int *p = NULL;    p = (int *)&a;    *p = 20; //间接赋值    printf("a:%d\n",a);//在C语言中,a变成了20,而在C++中,a依然是10    return 0;}

结论:

1、C语言中的const变量

2、C语言中的const变量是只读变量,有自己的存储空间

3、C++中的const常量

   可能分配存储空间,也可能不分配存储空间

   当const常量为全局,并且需要在其它文件中使用时,分配空间

   当使用&操作符取const常量取地址时,分配空间

   其他情况不分配空间

原创粉丝点击