ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一.标识符的可见性 1. **概念** **标识符** 在某一位置的有效性。 2. **覆盖规则** 局部支配全局,局部程度高支配局部程度低。 ## [$]二.名字查找 ### 1.无限定名字查找 1. **对象** 没有作用域运算符的任何标识符、作用域运算符最左边的标识符 2. **基本规则** + 由内向外依次查找每个外层作用域,直到最外层的全局作用域。只要找到了就会停止。 + 只有在使用点之前声明的名字才被考虑。 + 派生类作用域中没有找到名字,则会到基类作用域中寻找。 + 对于函数,还可能会进行函数形参的匹配。 ```c++ #include <iostream> using namespace std; int a = 1; int main() { int a = 2; { int a = 3; cout<<a<<endl;//直接在当前作用域中找到a } cout<<a<<endl;//直接在当前作用域中找到a return 0; } ``` ### 2.有限定名字查找 1. **对象** 有作用域运算符的标识符 2. **基本规则** + 若多级作用域运算符最左边无标识符,则从全局作用域中开始查找。 + 若多级作用域运算符最左边有标识符,则先对最左边的名字进行无限定名字查找。 + 接下来会在左边标识符的作用域中,寻找右边标识符的名字。若左边标识符的作用域中找不到则不会继续向下查找,而是报错。 ```c++ #include <iostream> using namespace std; int a = 0; namespace A { int a = 1; namespace B { int a = 2; } void test() { int a = 2; cout<<::a<<endl; //0 cout<<A::a<<endl; //1 cout<<A::B::a<<endl; //2 //cout<<::B::a<<endl; //错误,B不在全局作用域中 } } int main() { A::test(); return 0; } ``` >[test] >0 >1 >2 ### 3.两种名字查找的区别 区别: + 无限定的名字查找是从内到外查找,有限定的名字查找是从外到内查找。