天天看點

C++中const與#define的差別

先上一個典型程式:

#include<iostream>
using namespace std;

int main()
{
	int num = 1;

	#define t1 num + num
	#define t2 t1 % t1
	cout << "t2 is " << t2 << endl; // t2 is 2

	const int s1 = num + num;
	const int s2 = s1 % s1;
	cout << "s2 is " << s2 << endl; // s2 is 0

    return 0;
}
           

運作結果如注釋所示,分别得到“t2 is 2”、“s2 is 0”???

分析原因:const定義的常量s1、s2,則s1的值是num+num,s2的值是s1%s1,是以最後結果為“s2 is 0”;而define定義的變量作替換後,C++把cout<<"t2 is "<<t2<<endl;語句譯成了:cout<<"t2 is "<<num+num%num+num<<endl;是以結果為“t2 is 2”(1+0+1=2)

具體分析define與const的差別,如下定義:

const float PI = 3.14;
#define PI 3.14
           

(1)類型的安全性檢查:const常量有資料類型,而define定義宏常量沒有資料類型。則編譯器可以對前者進行類型安全檢查,而對後者隻進行字元替換,沒有類型安全檢查(字元替換時可能會産生意料不到的錯誤,如上面的程式所示);

(2)調試:部分排程工具可以對const常量進行排程,但不能對宏常量進行排程;

(3)編譯器的處理方式不同:define宏是在預處理階段展開,const常量則是編譯運作階段使用;

(4)存儲方式不同:define宏僅僅是展開,有幾個地方使用則展開幾次,不配置設定記憶體;const常量會在記憶體中配置設定位址(可以是堆中也可以是棧中);

(5)效率:define定義的常量在記憶體中有若幹個拷貝;const定義的常量在程式運作過程中隻有一份拷貝,甚至不為普通const常量配置設定存儲空間,而是将它們儲存在符号表中,相當于沒有了讀記憶體的操作,使得效率也很高