《C++覆辙录》——2.9:自反初始化
本節(jié)書摘來自異步社區(qū)出版社《C++覆轍錄》一書中的第2章,第2.9節(jié),作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號(hào)查看。
2.9:自反初始化
在以下的代碼里,var的值變成了多少?
int var = 12; {double var = var; // ... }``` 未有定義。C++語言中,某個(gè)名字在它的初始化對(duì)象被解析到之前就進(jìn)入了其轄域的話,在初始化對(duì)象引用到這個(gè)名字時(shí),它引用到的不是別的,正是這個(gè)剛剛被聲明的對(duì)象。沒有幾個(gè)軟件工程師會(huì)寫出像上面這么莫名其妙的聲明代碼,但也許復(fù)制、粘貼的手法會(huì)讓你陷入困境:int copy = 12; // 某深藏不露的變量
// ...
int y = (3x+2copy+5)/z; // 將y的賦值運(yùn)算符的右手邊操作數(shù)剪切……
// ...
void f(){
// 這里需要y的初始化值
int copy = (3x+2copy+5)/z; // 把上面的剪切內(nèi)容粘貼到此
}`
用預(yù)處理符號(hào)的話,你會(huì)犯和恣意復(fù)制、粘貼的行為完全一樣的錯(cuò)誤(參見常見錯(cuò)誤26):
struct buf{
char a, b, c, d;
};
// ...
void aFunc(){
char *buf = new char[sizeof(buf)];
// ... `
那個(gè)局域里的buf很可能會(huì)獲取4字節(jié)的內(nèi)存,足夠放置一個(gè)char *。這個(gè)錯(cuò)誤可能會(huì)很久都校驗(yàn)不出來,尤其在型別struct buf和指針型別變量buf`具有相同大小的時(shí)候23。遵守一個(gè)把型別和非型名的名字區(qū)分清楚的命名約定就可以在這個(gè)問題上防患于未然(參見常見錯(cuò)誤12):
int var = 12;
{
double var = var;
// ...
}
但它的變形呢?
const int val = 12;
{
enum {val = val};
// ...
}`
枚舉量val的值是多少?未有定義嗎?再猜一次。正確答案是其值為12,理由是枚舉量的聲明位置,與變量不同,是在它的初始化對(duì)象(嚴(yán)格地說,是枚舉量的定義)之后的。“=”之后的那個(gè)val,是在外層轄域中的常量。這段討論把我們帶入了一個(gè)更錯(cuò)綜復(fù)雜的局面:
總結(jié)
以上是生活随笔為你收集整理的《C++覆辙录》——2.9:自反初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python json模块 超级详解
- 下一篇: 《C++游戏编程入门(第4版)》——1.