C++基礎 002 const和#define

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);,可以正確執行嗎?
結果:報錯,可以發現constC++中提供了提供類型檢查和作用域檢查
     b作用域爲:fun1()函數內部。
在這裏插入圖片描述
補充:
如果想要#define a 10的作用域只在fun1()函數內部,可以在函數的末尾添加#undef a,卸載宏定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章