C++基础 002 const和#define

const和#define

/*
 *运行平台:Visual Studio 2015
 *参考资料:《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);,可以正确执行吗?
结果:报错,可以发现constC++中提供了提供类型检查和作用域检查
     b作用域为:fun1()函数内部。
在这里插入图片描述
补充:
如果想要#define a 10的作用域只在fun1()函数内部,可以在函数的末尾添加#undef a,卸载宏定义。

发布了40 篇原创文章 · 获赞 29 · 访问量 3613

猜你喜欢

转载自blog.csdn.net/weixin_42813232/article/details/105463128