成功離你只有一步之遙作文
這個面試問題幾乎是C++面試中每次都會有的題目。 事實(shí)上這個概念誰都有只是三種聲明方式非常相似很容易記混。 Bjarne在他的The C++ Programming Language里面給出過一個助記的方法: 把一個聲明從右向左讀。 const

char * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因?yàn)镃++里面沒有const*的運(yùn)算符,所以const只能屬于前面的類型。
拓展:
(1) 一般用途的const變量,絕對不應(yīng)該聲明在頭文件,定義在cpp里,尤其是基礎(chǔ)類型(int之類)這個和inline函數(shù)是類似的,編譯器能自動處理不同cpp中有同樣const的問題;如果不使用const變量的地址,這個const變量最終會被完全優(yōu)化掉,不占靜態(tài)存儲空間。而如果定義成 extern,會導(dǎo)致編譯器不得不為這個變量分配一個地址,并且在使用的時候強(qiáng)制地去從地址取得值,這會導(dǎo)致極大的性能下降。比如:
const int a = 16;
inline int sqr(x)
{
return a * a;
}
myFunc(sqr(a));
在這里,編譯器可以把整個sqr(a)都優(yōu)化掉,替換成一個立即數(shù)256。而如果a定義成了extern,這里就必須是讀數(shù)值、乘法、傳參數(shù)的過程了。
C++中編譯器對于const變量做了充分的優(yōu)化,它完全可以取代#define常量的一切功能。
比如:
const int MAX_N = 100;
int myArray[MAX_N];
在遇到使用const變量的時候,編譯器如果已知const變量的值,就會直接把值代入進(jìn)行優(yōu)化,和#define是完全一樣的。如果最后const變量沒有取地址之類的操作,編譯器就會認(rèn)為這個變量沒有被實(shí)際引用,于是在生成代碼的最后把整個const變量去掉。
const變量如果不另加定義,默認(rèn)就是static的。特意去定義成extern只會破壞編譯器效率。這個和C是完全不同的,所以不要把C的法則想當(dāng)然地用進(jìn)來。
不過對于const變量類型是復(fù)雜類型(類)的時候,static的類型可能會導(dǎo)致每個cpp里面都生成一個對象,這時候應(yīng)該考慮extern。
(2) const變量和#define宏相比最大的好處其實(shí)不在于類型檢查,而在于可以有命名空間
namespace MyNameSpace
{
#define myMacro 15
class MyClass
{
public:
const static int myConst = 15;
#define myMacro2 16
}
const int myConst2 = 16;
}
myConst必須用MyNameSpace::MyClass::myConst來引用,myConst2對應(yīng) MyNameSpace::myConst2,而#define的兩個常量永遠(yuǎn)都是myMacro和myMacro2,這意味著#define的常量重名的可能性要大得多,而且很容易破壞OOP結(jié)構(gòu)。
(3) 特殊情況下#define和const比可能會引起問題。比如函數(shù)重載:
void myFunc(int x)
{
...
}
void myFunc(short x)
{
...
}
const short myConst = 128;
#define myMacro 128
myFunc(myConst);
myFunc(myMacro);
#define由于沒有類型,會去調(diào)用int版本的函數(shù)。這是const強(qiáng)制類型檢查的好處
(4) const類型的編譯效率比較好
因?yàn)榫幾g器在編譯的時候已經(jīng)知道這個符號對應(yīng)的是某類型的數(shù)了,編譯會快一些。對運(yùn)行影響不大。還有:
#define MAXN (12*14)
const int MAX_N = 12 * 14;
使用MAXN的時候,編譯器每次都得對表達(dá)式求值;MAX_N的話,只求了一次。
(5) const類型不容易出錯
這個問題是老生常談了,#define MACRO 12+13這種寫法會出問題,必須加括號。const就沒這個問題。
(6) enum
enum其實(shí)可以看做是定義了一族const變量。它們同樣也有命名空間,同樣也有變量類型(不過變量類型是enum XXX),額外的,enum定義的常量不會使用額外的內(nèi)存空間。缺點(diǎn)在于:enum定義的常量,類型是enum XXX,不是int。雖然可以和int型數(shù)值無限制地轉(zhuǎn)換,但畢竟不是int,使用上不是那么方便,比如不能直接做加減乘除之類。
(7) #define的優(yōu)勢
#define在C++中的作用一般已經(jīng)不是定義常量或者宏了,如前文所說這些功能應(yīng)該由const和inline函數(shù)來代替。#define在C++中可以用來定義一些快捷語法,或者是根據(jù)編譯選項(xiàng)不同生成不同內(nèi)容:
#define L(x) L##x
L("abcde") /pic/p>
#ifdef _UNICODE
#define MyFunc MyFuncW
#else
#define MyFunc MyFuncA
#endif
這些功能目前還沒有其他語法可以替代。
【成功離你只有一步之遙作文】相關(guān)文章:
想要成功只有努力作文07-16
只有堅(jiān)持才會成功02-19
只有勤奮,才能成功02-19
一步之遙的文明作文02-06
[經(jīng)典]一步之遙的文明作文04-06
只有堅(jiān)持不懈才會取得成功!06-08
只有努力才能成功優(yōu)秀作文600字(精選20篇)01-06
- 相關(guān)推薦