| 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.没找到,报错
 注意:在成员函数的定义中,形参列表中使用的名字尽量不要和成员变量同名!!!????????
 |