您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱”吧!
ES.12: 不要在嵌套作用域中重復(fù)使用同樣的名稱
這會(huì)導(dǎo)致更難弄清楚到底哪個(gè)變量在使用??赡芤鹁S護(hù)問題。
Example, bad(反面示例)
int d = 0;
// ...
if (cond) {
// ...
d = 9;
// ...
}
else {
// ...
int d = 7;
// ...
d = value_to_be_returned;
// ...
}
return d;
這一個(gè)很大的if語(yǔ)句,很容易漏掉內(nèi)部作用域引入了一個(gè)新變量d這個(gè)事實(shí)。這是有名的錯(cuò)誤源之一。這種在內(nèi)部作用域中重用名稱的做法被稱為“遮蓋”。
Note(注意)
“遮蓋”主要是在函數(shù)太大或者過(guò)于復(fù)雜時(shí)發(fā)生問題。
Example(示例)
處于最外側(cè)的函數(shù)參數(shù)的遮蓋問題是被語(yǔ)言禁止的。
void f(int x)
{
int x = 4; // error: reuse of function argument name
if (x) {
int x = 7; // allowed, but bad
// ...
}
}
重用成員名稱作為局部變量同樣會(huì)引起問題:
struct S {
int m;
void f(int x);
};
void S::f(int x)
{
m = 7; // assign to member
if (x) {
int m = 9;
// ...
m = 99; // assign to local variable
// ...
}
}
我們經(jīng)常在派生類中重用基類的函數(shù)名:
struct B {
void f(int);
};
struct D : B {
void f(double);
using B::f;
};
這容易引發(fā)錯(cuò)誤。例如,如果我們忘記using聲明,調(diào)用d.f(1)時(shí)就無(wú)法發(fā)現(xiàn)f函數(shù)的整數(shù)版本。
我們是否需要定義一個(gè)特別的適用于類繼承情況下的遮蓋/隱藏規(guī)則?
Enforcement(實(shí)施建議)
Flag reuse of a name in nested local scopes
標(biāo)記嵌套作用域中的名稱重用。
Flag reuse of a member name as a local variable in a member function
標(biāo)記使用成員名稱定義局部變量的情況。
Flag reuse of a global name as a local variable or a member name
標(biāo)記使用全局名稱定義局部變量和成員名稱的情況。
Flag reuse of a base class member name in a derived class (except for function names)
標(biāo)記派生類中重用基類名稱的情況(函數(shù)名稱除外)
感謝各位的閱讀,以上就是“C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。