2017-02-17 99 views
1
#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(); 
} 

的输出是:为什么C++允许一个函数和一个类具有相同的名称?

空隙A()

为什么C++允许函数和类具有相同的名字?

+4

设计师做出了这个决定,没有人改变它......不知道你在找什么其他答案。也许是为了兼容C代码或其他现有代码 –

+0

我问,为什么不呢?只是为了不让人们迷惑自己? – csmckelvey

+2

我投票结束这个问题作为题外话,因为它应该发给Bjarne Stroustrup。其他任何事情都只是或多或少的不知情的意见。 – EJP

回答

1

我相信当你声明struct像你这样,你就必须把它称为struct A,不只是A此归结为与C

在C,向后兼容性。例如:

void A() {} 

struct A {}; 

void f() 
{ 
    A(); 

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

在这种情况下,它是有道理的,允许A意味着两个不同的东西,因为它总是清楚你的意思是哪一个,这取决于你是否使用struct与否。

在C++中,可以直接引用struct(和class es),​​而不需要使用struct关键字。这引入了您所关心的含糊不清,但另一种方法是像上面那样的有效C代码不是有效的C++代码,这更糟糕。

+0

@downvoter你能解释一下你认为这个答案有错吗? – svick

0

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

它与命名空间类似,其中相同的名称可以存在于多个域中。

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

+0

这是非常不同的。 OP实际上展示了一个例子,其中'A'类通常在范围内,但被函数'A'遮蔽。当然,变量也可以被隐藏,但只有当它们在不同的范围内。这里的类'A'和函数'A'都是全局的,所以同样的事情将不被允许用于变量。 – sepp2k

+0

@ sepp2k,狗可以像猫一样(哺乳动物),但在另一个(犬/猫)不同。这就是为什么我在使用术语域时非常小心。这种情况下的阴影只有'A'符号,你仍然可以看到它们两个。我会改变措辞,希望缓解你的担忧。 – paxdiablo

相关问题