名称和限定名称

用于二进制范围解析运算符 (::) 的名称称为“限定名”。在二进制范围解析运算符后指定的名称必须是在该运算符左侧指定的类的成员或其基类的成员。

在成员选择运算符(.–>)后指定的名称必须是在该运算符左侧指定的对象的类类型成员或其基类成员。 在成员选择运算符 (–>) 右侧指定的名称也可以是其他类类型的对象,前提是 –> 左侧是一个类对象并且该类定义了计算结果为指向某个其他类类型的指针的重载成员选择运算符 (–>)。(类成员访问中更深入地讨论了此配置。)

编译器将按以下顺序搜索名称,并在找到名称时停止搜索:

  1. 如果名称在函数内部使用,则搜索当前块范围;否则搜索全局范围。

  2. 由里向外的每个封闭块范围,包括最外面的函数范围(包括函数参数)。

  3. 如果名称在成员函数内使用,则在类的范围中搜索名称。

  4. 在类的基类中搜索名称。

  5. 搜索封闭的嵌套类范围(如果有)及其基项。 搜索继续,直到搜索最外面的封闭类范围。

  6. 在全局范围中搜索。

但是,您可对此搜索顺序做如下修改:

  1. 在名称前面放置 :: 可强制从全局范围处开始搜索。

  2. 在名称前面放置 class、struct 和 union 关键字可强制编译器仅搜索 class、struct 或 union 名称。

  3. 范围解析运算符 (::) 左侧的名称只能是 class、struct、namespaceunion 名称。

如果名称引用非静态成员,但用于静态成员函数,则将生成错误消息。 同样,如果名称引用封闭类中的任何非静态成员,则将生成错误消息,因为封闭类中没有此封闭类 this 指针。

请参见

参考

范围规则摘要