C++为什么不要在嵌套作用域中重复使用同样的名称

这篇文章主要讲解了“C++为什么不要在嵌套作用域中重复使用同样的名称”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++为什么不要在嵌套作用域中重复使用同样的名称”吧!

我们提供的服务有:成都网站建设、做网站、微信公众号开发、网站优化、网站认证、洛浦ssl等。为上千余家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的洛浦网站制作公司

ES.12: 不要在嵌套作用域中重复使用同样的名称

Reason(原因)

这会导致更难弄清楚到底哪个变量在使用。可能引起维护问题。

Example, bad(反面示例)

int d = 0;
// ...
if (cond) {
   // ...
   d = 9;
   // ...
}
else {
   // ...
   int d = 7;
   // ...
   d = value_to_be_returned;
   // ...
}

return d;

这一个很大的if语句,很容易漏掉内部作用域引入了一个新变量d这个事实。这是有名的错误源之一。这种在内部作用域中重用名称的做法被称为“遮盖”。

Note(注意)

“遮盖”主要是在函数太大或者过于复杂时发生问题。

Example(示例)

处于最外侧的函数参数的遮盖问题是被语言禁止的。

void f(int x)
{
   int x = 4;  // error: reuse of function argument name

   if (x) {
       int x = 7;  // allowed, but bad
       // ...
   }
}
Example, bad(反面示例)

重用成员名称作为局部变量同样会引起问题:

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(例外)

我们经常在派生类中重用基类的函数名:

struct B {
   void f(int);
};

struct D : B {
   void f(double);
   using B::f;
};

这容易引发错误。例如,如果我们忘记using声明,调用d.f(1)时就无法发现f函数的整数版本。

我们是否需要定义一个特别的适用于类继承情况下的遮盖/隐藏规则?

Enforcement(实施建议)

  • Flag reuse of a name in nested local scopes

  • 标记嵌套作用域中的名称重用。

  • Flag reuse of a member name as a local variable in a member function

  • 标记使用成员名称定义局部变量的情况。

  • Flag reuse of a global name as a local variable or a member name

  • 标记使用全局名称定义局部变量和成员名称的情况。

  • Flag reuse of a base class member name in a derived class (except for function names)

  • 标记派生类中重用基类名称的情况(函数名称除外)

感谢各位的阅读,以上就是“C++为什么不要在嵌套作用域中重复使用同样的名称”的内容了,经过本文的学习后,相信大家对C++为什么不要在嵌套作用域中重复使用同样的名称这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


网页名称:C++为什么不要在嵌套作用域中重复使用同样的名称
文章分享:http://myzitong.com/article/ggddhs.html