第3课 - 进化后的const分析

第3课 - 进化后的const分析

1. C语言中的const

  (1)const 修饰的变量具有只读属性,本质还是变量,只是告诉编译器该变量不能出现在赋值符号的左边

  (2)const 修饰的局部变量在栈上分配空间,修饰的全局变量在只读存储区分配空间

  (3)const 只在编译期间有用,在运行期间无用。const 不能定义真正意义上的常量(const英文含义)!

  (4)C语言中的常量只有枚举这一种类型。

2. C++中的const

  C++ 在 C 的基础上对 const 进行了进化处理

  (1)当编译器碰见 const 声明时在符号表中放入常量

  (2)编译过程中若发现使用常量则直接以符号表中的值替换

      何为符号表?符号表是编译器在编译程序时产生的一张表格,其本质是编译器在编译程序时产生的一种数据结构

  (3)编译过程中若发现下述情况则给对应的常量分配存储空间

      ① 对 const 常量使用了 extern 关键字

      ② 对 const 常量使用 & 操作符

  Note1:C++编译器虽然可能为 const 常量分配内存空间,但不会使用其存储空间中的值,这样做只是为了兼容C语言。

  Note2何为兼容? C++完全兼容C指的是,用C编译器能编译通过的C程序,使用C++编译器也可以成功编译,但是执行结果不一定相同

 1 #include <stdio.h>
 2
 3 int main()
 4 {
 5     const int c = 0;      //C语言中会为变量c分配内存
 6     int* p = (int *)&c;   //C++中遇到&才为c分配内存
 7
 8     printf("Begin...\n");
 9
10     *p = 5;
11
12     printf("c = %d\n", c);   // C语言会输出内存中的5
13                                         // C++中会从符号表(而不是内存)中取值,所以为0
14
15     printf("*p = %d\n", *p);
16
17     printf("End...\n");
18
19     return 0;
20 }
21
22 //  在C中的输出结果: c = 5 , *p = 5
23 //  在C++中的输出结果:c = 0 , *p = 5

C/C++中的const

3. 对比C/C++中的const

  本质 分配内存
C 只读变量
局部变量分配在栈上;全局变量分配在只读存储区

C++ 常量
当使用 & 操作符对const常量取地址时会分配内存空间;

当const修饰全局变量,并且在其它文件中使用extern引用时会分配内存空间

4. C++中的const与宏的区别

  定义 处理方式
C++中的const const int c = 5; 由编译器处理,编译器会进行类型检查和作用域检查
# define c 5 由预处理器处理,只是简单的文本替换

 1 #include <stdio.h>
 2
 3 void f()
 4 {
 5     #define a 3            // 宏没有作用域的概念
 6     const int b = 4;    // const有作用域的概念,只在f()内部有效,g()不能引用
 7 }
 8
 9 void g()
10 {
11     printf("a = %d\n", a);
12     printf("b = %d\n", b);    // 这里会发生错误
13 }
14
15 int main()
16 {
17     const int A = 1;
18     const int B = 2;
19     int array[A + B] = {0};  // 在C中编译该句代码时,由于 A+B 两个变量的和只能在运行时确定,因此会报错
20                              // C++可以从符号表中取得A + B的值为3
21     int i = 0;
22
23     for(i=0; i<(A + B); i++)
24     {
25         printf("array[%d] = %d\n", i, array[i]);
26     }
27
28     f();
29     g();
30
31     return 0;
32 }

C++中的const与宏

5. 小结

  (1)与C语言不同,C++中的const不是只读变量

  (2)C++中的const是一个真正意义上的常量

  (3)C++编译器可能会为const常量分配空间

  (4)C++完全兼容C语言中的const常量的语法特性

时间: 2024-10-09 16:56:11

第3课 - 进化后的const分析的相关文章

第3课 进化后的 const分析

1.  C语言中的const (1)const修饰的变量是只读的,使得变量具有只读属性,但本质还是变量.所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. (2)const修饰的局部变量在栈上分配空间,全局变量在只读存储区分配空间 (3)const只在编译期有用,在运行期无用 [编程实验]C/C++中的const #include <stdio.h> int main() { const int c = 0; //C语言中会为变量c分配内存 int* p = (int*)&a

进化后的 const(二)

我们之前说过在 C 语言中:const 修饰的变量是只读的,其本质还是变量:它修饰的局部变量在栈上分配空间,修饰的全局变量在只读存储区分配空间:const 只在编译期有效,在运行期无用:const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边而已. C 语言中的 const 使得变量具有只读属性,所以它在 C 语言中不能定义真正意义上的常量!在 C 语言中,能定义常量的只有 enum(枚举)啦.但是 C++ 在 C 语言的基础上对 const 进行了进化处理:当碰见 c

vlc-android对于通过Live555接收到音视频数据包后的处理分析

通过ndk-gdb跟踪调试vlc-android来分析从连接到RTSP服务器并接收到音视频数据包后的处理过程. 首先,从前面的文章有分析过vlc-android的处理过程通过线程函数Run()(Src/input/input.c)来处理的,代码如下: [cpp] view plaincopy static void *Run( void *obj ) { input_thread_t *p_input = (input_thread_t *)obj; const int canc = vlc_s

C++ 成员函数前和函数后加const修饰符区别

博客转载自: https://www.iteblog.com/archives/214.html 分析以下一段程序,阐述成员函数后缀const 和 成员函数前const 的作用 #include<iostream> using namespace std; class TestClass { public: size_t length() const; const char* getPContent(); void setLengthValid(bool isLengthValid); pri

[Reprint]C++函数前和函数后加const修饰符区别

c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostream> 02   03 using namespace std; 04   05 // Ahthor:  过往记忆 06 // E-mail:  [email protected] 07 // Blog:    http://www.iteblog.com 08 // 转载请注明出处 09   10

webpack4+(打包后的文件分析+HTML插件+样式处理)

(1)打包后的文件分析 首先将打包后的文件进行适当删减,Ctrl+Shift+L可以同时选中所有相同结构内容 结构如下 (function(modules){ ... })( { ... } ) 分析可知本质为匿名函数即IIFE函数,执行时会传入后面函数执行符里的对象,接下来分析下传入对象 key指的是当前模块路径 value (2)HTML插件 (3)样式处理 . 原文地址:https://www.cnblogs.com/jianxian/p/12416586.html

缓冲区溢出分析第06课:W32Dasm缓冲区溢出分析

漏洞报告分析 学习过破解的朋友一定听说过W32Dasm这款逆向分析工具.它是一个静态反汇编工具,在IDA Pro流行之前,是破解界人士必然要学会使用的工具之一,它也被比作破解界的"屠龙刀". 但是即便是这么一款破解界的"神器",竟然也是存在着缓冲区溢出的漏洞的.可见,它在破解无数程序的同时,其自身也存在着被"黑"的风险.那么我们可以首先分析一下漏洞报告: ##############################################

cpp反汇编之const分析

先来分析一个简单的例子.(注意容易出错) 代码非常简单 #include<iostream> #include<cstdio> using namespace std; int main(){ const int a = 1; int* b = (int*)&a; *b = 2; cout << a << endl << *b << endl; return 0; } 反汇编分析  重点之处有注释 1: #include<

第41课 内存操作经典问题分析一

1. 野指针 (1)指针变量中的值是非法的内存地址,进而形成野指针 (2)野指针不是NULL指针,是指向不可用内存地址的指针 (3)NULL指针并无危害,很好判断,也很好调试 (4)C语言中无法判断一个指针所保存的地址是否合法 2. 野指针的由来 (1)局部指针变量没有被初始化 (2)指针所指向的变量在指针之前被销毁 (3)使用己经释放过的指针 (4)进行了错误的指针运算 (5)进行了错误的强制类型转换 [实例分析]野指针初探 #include <stdio.h> #include <m