当类和函数具有相同的名称时会发生什么
What happens when a class and a function have the same name?
#include <iostream>
using namespace std;
struct test
{
test(){cout<<"class"<<endl;}
};
void test(){cout<<"function"<<endl;}
int main()
{
test();
return 0;
}
输出:
function
(VS2013 ang gcc 4.8.1(
为什么选择功能?是不是模棱两可?
这
称为名称隐藏,并在
3.3 作用域
3.3.1 声明性区域和作用域 [basic.scope.declarative]
4( 给定单个声明区域中的一组声明,每个声明 指定相同的非限定名称,
— 它们都应指 同一实体,或全部引用函数和函数模板;或
— 只有一个声明应声明类名或枚举 不是 typedef 名称的名称和其他声明应全部 引用相同的变量或枚举器,或全部引用函数 和功能模板;在本例中为类名或枚举 名称处于隐藏状态 (3.3.10(。[...]
强调我的。
请注意,更改声明顺序不会影响结果:
void test(){cout<<"function"<<endl;}
struct test
{
test(){cout<<"class"<<endl;}
};
int main()
{
test();
return 0;
}
仍然打印出function
.
如果它不明显,请不要这样做:)
从 N3485 §3.3.10 [basic.scope.hiding]/2
:类名 (9.1( 或枚举名 (7.2( 可以通过变量、数据成员、 函数,或在同一范围内声明的枚举器。
因此,该函数优先于类。
如注释中所述,该类仍可通过 class
或 struct
关键字访问。如果类优先,则该函数将无法访问。
我不确定前面的任何一个响应都是您的特定实例的"为什么"。
不要误会我的意思;它们是真实和准确的。
我只是觉得更简单。
在您的示例中,您永远不会实例化结构。
换句话说,你声明了它,但你从未使用它。
由于您从未引用过它,因此永远不会调用它。
名称优先级等在这里并不真正适用,因为您从未实例化过结构。
希望这有帮助,
-John
相关文章:
- 什么时候调用组成单元对象的析构函数
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 什么时候调用析构函数
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 是什么让放置新调用对象的构造函数?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 在C 中,对2D数组的增量是什么?函数断言(0)做什么?
- 我应该使用什么函数签名来返回对可能不存在的对象的引用
- 一个类的构造函数,为另一个类进行强制转换.将调用什么函数
- 在 opencv for c 中,什么函数与 Mat::convertTo 和 cvtColor() 完全相同
- 当按下Alt-Enter键时调用什么函数
- C库导出什么函数?
- 使用什么函数来选择文本
- c++在空类中编写和调用什么函数?
- 在共享库的构造函数(_init部分)中,如何知道什么函数被中断了?
- 我可以用什么函数来获取按钮的把手