溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱

發(fā)布時(shí)間:2021-11-26 14:42:12 來(lái)源:億速云 閱讀:138 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C++為什么不要在嵌套作用域中重復(fù)使用同樣的名稱”吧!

ES.12: 不要在嵌套作用域中重復(fù)使用同樣的名稱

Reason(原因)

這會(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
       // ...
   }
}
Example, 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
       // ...
   }
}
Exception(例外)

我們經(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)注!

向AI問一下細(xì)節(jié)

免責(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)容。

c++
AI