const和#define
/*
*运行平台:Visual Studio 2015(Debug x86)
*参考资料:《C++ Primer Plus(第6版)》,传智扫地增C++基础课程
*/
一、const
1、const在C/C++的基本用法
典型例子如下:
const int a 与 int const a
这两个定义的最终结果是相同的:代表一个常整形数。const int *p 与 int * const p
对于const int *p
:代表的是当前指针变量所指向的内存空间不可更改。
对于int * const p
:代表的是当前指针变量的值不可更改。
画图说明:
- 利用const好处
1、指针做函数参数,可以有效的提高代码可读性,减少bug;
2、清楚的分清参数的输入和输出特性
2、const在C中是一个冒牌货,在C++中是一个正品
- C编译器中:
为什么说const在C中是一个冒牌货呢,这个冒牌体现在哪里?
用一个程序来说明
void main()
{
const int a = 10;
int *p = NULL;
p = &a;
*p = 20;
printf("a:%d\n", a);
printf("*p:%d\n", *p);
system("pause");
}
在C编译器执行结果为:可以看到const int a
的值依旧被修改了。
- C++编译器中:
那么在C++中的正品体现在哪里呢?
执行相同的程序:
void main()
{
const int a = 10;
int *p = NULL;
p =(int *)&a; //由于C++对const进行优化,需要强制转换
*p = 20;
printf("a:%d\n", a);
printf("*p:%d\n", *p);
system("pause");
}
在C++编译器执行结果为:可以看到const int a
的值依旧没有修改了。
3、为什么会这样呢
因为:
-
C语言中的const变量是只读变量,有自己的存储空间。
-
C++中的const常量是以名字对的方式存储在符号表上,可能分配存储空间,也可能不分配存储空间 。
注意:在调用时会在内存里面分配一个内存空间来存储10这个值,所以*p = 20
修改的是10这个值的内存空间,并不是a这个变量的内存空间。
二、const与#define
1、二者的相似之处
在C++中的const常量类似于宏定义const int c = 5; ≈ #define c 5
2、二者的不同之处
- 对于
const
:是由编译器处理的,提供类型检查和作用域检查。 - 对于
#define:
由预处理器处理,单纯的文本替换。
通过执行一段程序来证明:
void fun1()
{
#define a 10
const int b = 20;
}
void fun2()
{
printf("a = %d\n", a);
}
int main()
{
fun1();
fun2();
return 0;
}
结果: 在fun2()
中调用fun1()
中的a
可以成功输出a的值
a
的作用域为:该C文件中,并不是在fun1()
提问:那么如果在fun2()
中加上printf("b = %d\n", b);
,可以正确执行吗?
结果:报错,可以发现const
在C++中提供了提供类型检查和作用域检查,
b
的作用域为:fun1()
函数内部。
补充:
如果想要#define a 10
的作用域只在fun1()
函数内部,可以在函数的末尾添加#undef a
,卸载宏定义。
转载:https://blog.csdn.net/weixin_42813232/article/details/105463128
查看评论