【问题标题】:Why does C++ allow a function and a class have a same name?为什么C++允许函数和类同名?
【发布时间】:2017-02-17 03:09:10
【问题描述】:
#include <iostream>

using namespace std;

struct A
{
    A()
    {
        cout << "A::A()" << endl;
    }
};

int A()
{
    cout << "void A()" << endl;
    return 0;
}

int main()
{
    auto v = A();
}

输出是:

void A()

为什么 C++ 允许函数和类同名?

【问题讨论】:

  • 设计师做出了这个决定,但没有人改变它......不确定你在寻找什么其他答案。也许是为了兼容 C 代码或其他现有代码
  • 我问,为什么不呢?只是为了不让人迷惑自己?
  • 我投票决定将此问题作为题外话结束,因为它应该发给 Bjarne Stroustrup。其他任何事情都或多或少是不知情的意见。

标签: c++ function class standards language-design


【解决方案1】:

我相信这归结为与 C 的向后兼容性。

在 C 中,当您像以前一样声明 struct 时,您必须将其称为 struct A,而不仅仅是 A。例如:

void A() {}

struct A {};

void f()
{
    A();

    struct A x; // works fine
    A y; // does not compile
}

在这种情况下,允许A 表示两种不同的东西是有意义的,因为根据您是否使用struct,您总是很清楚您指的是哪一种。

在 C++ 中,可以直接引用 structs(和 classes),而无需使用 struct 关键字。这引入了您担心的歧义,但另一种选择是,像上面这样的有效 C 代码不是有效的 C++ 代码,这更糟。

【讨论】:

  • @downvoter 你能解释一下你认为这个答案有什么问题吗?
【解决方案2】:

为什么?因为这就是语言的方式 A::A() 函数属于与 A() 不同的“域”。

类似于命名空间,同名可以存在于多个域中。

这也有点类似于拥有一千个不同的函数(或范围),它们都有自己的循环计数器,称为 i

【讨论】:

  • 这是非常不同的。 OP 实际上显示了一个示例,其中 A 类通常在范围内,但被函数 A 遮蔽。现在当然变量也可以被遮蔽,但前提是它们位于不同的范围内。这里A 的类和A 的函数都是全局的,所以不允许对变量做同样的事情。
  • @sepp2k,狗在某种方面可能像猫(哺乳动物),但在另一种方面却不同(犬/猫)。这就是为什么我在使用术语域时要小心。在这种情况下,阴影只是A 符号,您仍然可以同时使用它们。我会更改措辞,希望能减轻您的担忧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
相关资源
最近更新 更多