这是允许的吗?
Class A{
...
...
};
A a; //Global object
int main()
{
A a; // Local object
.
.
.
.
return 0;
}
这里已经在类定义之后声明了一个全局对象,但是也声明了一个局部变量。好吗?为什么呢?
答案 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)
这是正确的,因为 操作系统需要知道变量的范围。如果变量是本地的,那么当程序超出该函数的范围时,该变量应该被销毁,而全局变量不应该被销毁,除非程序退出。为此,全局变量存储在堆中,局部变量存储在堆栈中。你可以做到这一点,但它不是好的,因为如果你编写一个包含大量类和具有相同名称的全局变量的代码,它会使你的代码混乱。