【问题标题】:variables declaration with same name C++同名 C++ 变量声明
【发布时间】:2015-07-23 10:21:33
【问题描述】:

这是否允许?

Class A{
...
...
};

A a; //Global object

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

这里在类定义之后声明了一个全局对象,同时也声明了一个局部变量。可以吗?为什么?

【问题讨论】:

  • 顺便说一句,这不是“重载”。超载是完全不同的动物。

标签: c++ object overloading global


【解决方案1】:

“隐藏”一个对象的声明是完全合法的,而另一个声明的范围更窄。在您的 ma​​in 函数中,a 将引用局部变量。在 ma​​in 函数之外,a 将引用全局变量。

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

【讨论】:

    【解决方案2】:

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

    #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
      }
    }
    

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

    【讨论】:

      【解决方案3】:

      虽然语法是正确的,编译器在编译这段代码时不会有问题,因为当您访问main内部的a时,它将引用本地副本,而外部mainit将引用全局。

      但是这种编码方式,局部变量和全局变量使用相同的名称是个坏主意,因为别人读起来很混乱,而且如果代码很大,即使你也很难跟踪它。

      【讨论】:

        【解决方案4】:

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

        即在你的主函数中使用'::a'实际上将访问'a'的全局范围版本,而不是本地范围。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 操作系统与变量作用域无关。源代码编译后不存在变量作用域之类的东西。初始化的全局变量存储在.data段中,而不是堆上,未初始化的全局变量——在.bss段中。
          猜你喜欢
          • 2015-03-09
          • 1970-01-01
          • 2022-06-17
          • 2013-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多