這個(gè)含義的多重性能導(dǎo)致一些難以發(fā)現(xiàn)的錯(cuò)誤:
// copy a string from pSource to pTarget -- incorrect version.
while(pSource)
{
*pTarget++ = *pSource++;
}
此例中的while循環(huán)試圖把由pSource指向的源字符串復(fù)制到由pTarget指向的內(nèi)存塊。但不幸的是,條件寫錯(cuò)了,它應(yīng)這樣寫出:
// copy a string from pSource to pTarget -- incorrect version.
while(*pSource)
{
*pTarget++ = *pSource++;
}
你可以看到,當(dāng)由pSource指向的字符為NULL時(shí),終止條件出現(xiàn)。這是0的第四定義。然而,這里寫出的代碼卻是去查看地址pSource是否為零,這是第二定義。
最終結(jié)果是while()循環(huán)繼續(xù)寫入內(nèi)存直到程序崩潰。
0的其他定義之間也可能產(chǎn)生混亂。唯一的解決辦法就是當(dāng)你使用常數(shù)0的時(shí)候小心一點(diǎn)。
聲明的混亂處
復(fù)合聲明是非;靵y的,但C++--以它的熱忱保持了與C的反向兼容性--但也產(chǎn)生了一些聲明間的矛盾,你必須避免這種矛盾。
class Myclass
{
public:
Myclass(int nArg1 = 0,int nArg2 = 0);
};
Myclass mcA(1,2);
Myclass mcB(1);
Myclass mcC();
mcA是參數(shù)1和2構(gòu)成的對(duì)象,而mcB是參數(shù)1和0構(gòu)成的對(duì)象。因此你可能認(rèn)為mcC是參數(shù)0和0構(gòu)成的對(duì)象,然而情況不是這樣。而mcC()是一個(gè)不帶參數(shù)的函數(shù),它用數(shù)值返回類Myclass的對(duì)象。
另一個(gè)混亂產(chǎn)生于初始化運(yùn)算符=的使用:
Myclass mcB = nA; // same as Myclass mcB(nA)
為了增強(qiáng)與C的兼容性,答應(yīng)這樣使用=;然而你應(yīng)該避免這種結(jié)構(gòu),因?yàn)樗皇且回炦m用的。例如下列程序就不會(huì)有預(yù)期的效果:
Myclass mcA = nA,nB;
這說(shuō)明一個(gè)對(duì)象mcA(nA),它后面有一個(gè)獨(dú)立的使用缺省構(gòu)造符的對(duì)象nB,而不是說(shuō)明一個(gè)對(duì)象mcA(nA,nB)。
堅(jiān)持使用C++格式--這是最安全的。
相關(guān)推薦:計(jì)算機(jī)技術(shù)與軟件專業(yè)技術(shù)資格(水平)考試官網(wǎng)匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |