我正在使用列出的书籍学习 C++ here 。特别是,我读到了有关重载的内容。因此,在阅读之后,我正在尝试不同的例子来进一步阐明我的概念。下面给出了一个我无法理解其输出的示例:
int Name = 0;
class Name
{
int x[2];
};
void func()
{
std::cout << sizeof(Name) << std::endl; //My question is: Why here Name refers to the integer variable Name and not class named Name
}
int main()
{
func();
}
当我打电话func
时,然后在语句 std::cout << sizeof(Name) << std::endl;
中, Name
指int
Name
而不是名为 Name
的类。为什么会这样呢?我预计这会给我带来歧义错误,因为有两个(不同的)实体具有相同的名称。但程序运行时没有任何错误并且 sizeof
应用于int Name
而不是名为 Name
的类。我在书中读到过有关函数重载的内容。但不是关于这种重载。它叫什么以及这里发生了什么。
PS:我知道我可以写std::cout<< sizeof(class Name);
哪里sizeof
将应用于名为 Name
的类而不是变量int Name
。此外,该示例仅用于学术目的。我知道应该避免使用全局变量。问题不是如何解决这个问题(例如,对这两个实体不使用相同的名称),而是关于正在发生的事情。
最佳答案
这里发生的是“影子”。全局变量隐藏同名的类。
您可以采取以下措施来避免这种情况:
- (不要使用全局变量)
- 不要给不同的实体使用相同的名称。通常,变量和类型的命名约定是不同的(例如,变量的命名约定为
name
,类型的命名约定为Name
)。 - 明确表明您想要通过
std::cout << sizeof(class Name) << std::endl;
引用该类型 - 如果您确实希望它们具有相同的名称,可以将它们放置在不同的命名空间中。
例如:
#include <iostream>
namespace foo {
int Name = 0;
}
namespace bar {
class Name {
int x[2];
};
}
namespace baz {
void func() {
std::cout << sizeof(foo::Name) << std::endl;
std::cout << sizeof(bar::Name) << std::endl;
}
}
int main()
{
baz::func();
}
PS:正如评论中提到的,这与重载无关。影子通常是指具有相同名称的实体,但只有一个实体可以通过该名称访问。重载与此有很大不同,因为当您重载一个函数时,通常所有重载都可以访问,并且重载解析决定使用哪一个。
关于c++ - 用整型变量重载类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71049612/