您的位置:首页 > 编程语言 > C语言/C++

C++进阶—>const和define机制剖析

2017-10-11 14:18 309 查看

C++中的const和define

1 const基础知识(用法、含义、好处)

初级理解:const是定义常量==》const意味着只读 

const int a;

int const b;

const int *c;

int * const d;

const int * const e ;

含义:

//第一个第二个意思一样 代表一个常整形数

//第三个 c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改)

//第四个 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)

//第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)

const好处

//合理的利用const,

//1.指针做函数参数,可以有效的提高代码可读性,减少bug;

//2.清楚的分清参数的输入和输出特性

int setTeacher_err( const Teacher *p)

Const修改形参的时候,在利用形参不能修改指针所向的内存空间,即指针所指内存空间中的数据不能被修改 保证了内存空间中数据的安全性,避免多个指向该内存空间的指针对该内存空间中的数据不断的被修改导致程序错误,保证了数据的互斥性。

2 C++中const运行机制

 

int main()

{

         const int a = 10;

         int *p = (int*)&a;

         printf("a===>%d\n", a);

         *p = 11;

         printf("a===>%d\n", a);

         return 0;

}

C++编译器对const常量的处理:

当碰见常量声明时,C++编译器会将所有的const常量以(key,value)的形式存储在符号表中,此符号表用户无法操作,仅可取地址;

编译过程中若发现使用常量则直接以符号表中的值替换,如上述代码a=10,在程序中遇到a直接将其替换为10;

编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(分配的存储空间有别于符号表空间,是单独分配出来用户可操作的存储空间)

注意:

C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

结论:

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

2.C++中的const常量可能分配存储空间,也可能不分配存储空间 

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

当使用&操作符取const常量的地址,需要分配存储空间

 


3 #define基础知识

 

void fun1()

{

   #define a 10

   const int b = 20;

   //#undef a  # undef //若不让define具有全局性,则在后加上undef注销所有定义的常量,undef a 仅仅注销a常量。

}

 

void fun2()

{

   printf("a = %d\n", a);

   printf("b = %d\n", b);

}

 

int main()

{

   fun1();

   fun2();

   return 0;

}

#define的含义与const相同,都是定义常量,只是define定义的为全局型常量,const定义的常量有作用域

4 const和#define区别


对比:

1. C++中的const常量类似于宏定义

     const int c = 5; ≈ #define c 5

2.C++中的const常量与宏定义不同

   const常量是由编译器处理的,提供类型检查和作用域检查,并可根据对常量的使用情况分配存储空间

   宏定义(define)由预处理器处理,单纯的文本替换

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: