变量声明同名C ++

时间:2015-07-23 10:21:34

标签: c++ object overloading global

这是允许的吗?

Class A{
...
...
};

A a; //Global object

int main()
{
   A a; // Local object
   .
   .
   .
   .
   return 0;
}

这里已经在类定义之后声明了一个全局对象,但是也声明了一个局部变量。好吗?为什么呢?

5 个答案:

答案 0 :(得分:3)

隐藏"完全合法。一个对象的声明,另一个声明在更严格的范围内。在函数中, a 将引用局部变量。在函数之外, a 将引用全局变量。

是否"确定" - 我会说"不"。这是一个坏主意,因为它可能会使您的代码混乱,并且更容易意外地引入错误。我不建议这样做。

答案 1 :(得分:1)

请记住,虽然理论上可以访问两个变量,但当其中一个变量被遮蔽时,就不可能兼顾三个变量。

#include <iostream>

int a = 1;

int main()
{
  int a = 2;
  {
     std::cout << a;   // 2
     std::cout << ::a; // 1

     int a = 3;
     std::cout << a;   // 3
     std::cout << ::a; // 1

     // there is no way to get to a that has 2 written in it
     // that is until we reach the closing curly brackets below
  }
}

当您看到包含阴影的代码时,这通常表明程序员无法很好地命名变量。每个变量应尽可能具有描述性,而不会过长。

答案 2 :(得分:0)

虽然语法正确,但编译器在编译此代码时没有问题,因为当您在java -cp CLASSPATH -Dlog4j.configuration=file:XMLFILE ClassName args 内访问a时,它将引用本地副本,而在外部main它将引用全球的。

但是这种编码方式,对于局部变量和全局变量使用相同的名称是个坏主意,因为它让其他人阅读起来非常混乱,如果代码很大,甚至你会发现很难跟踪它。

答案 3 :(得分:0)

我同意这里的其他帖子。这不是一个好主意,但偶尔会突然出现。您可以使用全局范围运算符来访问本地范围之外的同名变量。

即使用&#39; :: a&#39;您的主要功能内部实际上将访问&#39; a&#39;的全球范围版本,而不是本地范围。

答案 4 :(得分:-1)

这是正确的,因为     操作系统需要知道变量的范围。如果变量是本地的,那么当程序超出该函数的范围时,该变量应该被销毁,而全局变量不应该被销毁,除非程序退出。为此,全局变量存储在堆中,局部变量存储在堆栈中。你可以做到这一点,但它不是好的,因为如果你编写一个包含大量类和具有相同名称的全局变量的代码,它会使你的代码混乱。