c++ - 用整型变量重载类名

标签 c++ class integer language-lawyer overloading

我正在使用列出的书籍学习 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; 中, Nameint 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/

相关文章:

c++ - 将字符串数组传递给方法

c# - 可能与类名和属性名冲突?

php - 使用 PHP Reflection 获取非静态的公共(public)属性

java - Java中如何检查字符串的名称是否与整数的名称相同?

c - 不使用 64 位数据类型的 32 位有符号整数乘法

c++ - C 头文件不能用 C 编译,但可以用 C++ 编译

c++ - 将外部模板类与 STL 类一起使用

java - 如何在JSP页面中将整数转换为日期,然后格式化该日期?

c++ - 在 visual studio 2010 上使用 opencv 进行球跟踪会出现未处理的异常

php - 如何创建一个可以转换为 boolean 值的 php 类(真值或假值)