1.在了解类定义中,名字的查找规则之前,我们先来了解下普通的名字查找规则
- 当前作用域中查找,只考虑在名字使用之前出现的声明
- 外层作用域中查找
- 没找到,报错
代码示例:
void PrintValue(){
printf("%d\n",a); // 这里会报错,因为a的定义出现在函数的后面
}
int a = 100;
int main( void ){
PrintValue();
return 0;
}
int a = 100;
void PrintValue(){
printf("%d\n",a); // 这里不会报错
}
int main( void ){
PrintValue();
return 0;
}
2.类中使用的名字查找规则
2.1首先我们需要先了解编译器对类定义的处理逻辑:
- 首先编译类中的所有声明(成员变量的类型名和变量名,成员函数的返回类型名)
- 直到类全部可见后,才会去编译处理成员函数的函数体
这里举个例子让大家有一个直观的感受
class CD{
public:
...
int GetValue() const{
return a; // 如果这里还使用普通的名字查找规则,那么会先处理函数体中的变量a,此时变量a还没有出现
}
private:
int a = 100;
};
上述代码编译的时候没有报错,说明在编译过程中,GetValue函数,找到了在它下面定义的成员变量a。
2.2关于类中使用的名字查找规则,我这里先说结论,然后通过代码来验证结论
①成员变量声明中使用的类型名,成员函数声明中返回类型的类型名 查找规则是:
1.当前作用域中查找,只考虑在名字使用之前出现的声明 2.外层作用域中查找---类定义之前的作用域中查找 3.没找到,报错
②成员函数函数体中的名字查找
1.当前作用域中查找,只考虑在名字使用之前出现的声明 2.在类定义中查找 3.在外层作用域中查找 如果成员函数定义在类里面,那么就在类定义之前的作用域中查找 如果成员函数定义在类外面,那么就在成员函数定义之前的作用域中查找 4.没找到,报错
注意: 在成员函数的定义中,形参列表中使用的名字尽量不要和成员变量同名!!!????????
|