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
,卸載宏定義。