我想知道C ++名称查找机制是什么。
答案 0 :(得分:14)
名称查找是识别名称含义的过程。名称查找有两个目的
例如,如果您有此代码
T(a);
这取决于T
是否是一个类型:如果它是一个类型,它将是a
的声明,如果它不是一个类型,它被解释为一个函数呼叫。
某些名称表示类型或模板。通常,只要遇到名称,就必须在继续解析包含它的程序之前确定该名称是否表示这些实体之一。确定此问题的过程称为名称查找。
名称查找将名称的使用与该名称的声明(3.1)相关联。
有两个主要的名称查找类
::
运算符查看给定范围内的名称。 存在其他几种形式,例如查找点或箭头后面显示的名称(如ptr->foo
)或查找class foo
中的名称(忽略非类型名称)。一个特别有趣的形式是argument dependent lookup,用于根据函数调用中使用的参数类型查找函数声明。
在名称查找后发现了一个声明,它会检查它有什么属性以及程序是否可以使用它。
只有在名称查找,函数重载解析(如果适用)和访问检查成功后,才会在表达式处理中进一步使用名称声明引入的属性
因此,名称查找将找到私有类成员,但如果您使用这些名称而无法访问它们,则会拒绝您的代码。即使基类具有与公共访问相同的名称,也是如此 - 这是因为如果找到名称,则名称查找在派生类中停止。
答案 1 :(得分:2)
我不知道你是否要求用一个类比来描述查找的名称。但我会对上述问题给出一个可能的答案。 在深入研究名称查找机制之前,让我们将两个概念映射为有趣和使用。
我不想解释这个类比的原因。在以下字面思维方式中,每次遇到范围时,请将范围替换为 目录 。 文件 对象也是如此。
#include <iostream>
using namespace std;
namespace Newton{
double distance, time;
double velocity(const double &, const double &);
}
namespace Einstein{
double distance, time;
double velocity(const double &, const double &);
}
int main()
{
using namespace Newton;
double s(10), t(10);
velocity(s,t);
return 0;
}
double Newton::velocity(const double & s, const double & t){
distance = s;
time = t;
cout << "Calculation by Newton" << endl;
return distance / time;
}
double Einstein::velocity(const double & s, const double & t){
distance = s;
time = t;
cout << "Calculation by Einstein" << endl;
return distance / time;
}
在此代码中,velocity
的实现是什么?我们在velocity
的社交中遇到了main()
个功能。如果您将其命名为文件资源管理器中的路径名,velocity
实际上是/Main/velocity
。当然,如果检查/Main/
下的对象名称,仍然有两个双重对象s
和t
,以及一个名称空间对象Newton
。如果列出/Main/double/
下的对象名称,我认为内置函数与名为velocity
的对象不匹配,这意味着,例如,没有这样的对象 - {{1} }。如果在/Built-in Types/double/velocity
下再次列出对象的名称,则实际目录是/Main/Newton/
,因为它在那里被声明。然后,列出/Newton/
下的对象名称,我们找到两个双重对象/Newton/
和distance
,以及一个名为time
的函数。是的,我们找到velocity
的候选函数。
我只能在c ++中给出名称查找的类比。结束机制还有更多要补充的内容。
答案 2 :(得分:1)
它的核心是编译器用来确定给定名称对应的过程 - 是变量或函数或其他语言构造。它必须找到名称所指的底层语言结构。
e.g。当您调用函数 printf()时,编译器必须找到 printf 的声明,以便它理解它是什么并且可以正确编译它。
如前所述,C ++使用各种名称查找机制,您可以使用Google轻松找到有关它们的信息。维基百科也有一些基本信息:http://en.wikipedia.org/wiki/Name_resolution