名字查找与类的作用域
名字查找
成员函数中使用的名字
类的定义分为两步处理:编译成员的声明->类全部可见后才编译函数体。
因为成员函数体直到整个类可见后才被处理,所以它能使用类中定义的任何名字
成员函数使用的名字解析顺序如下:
- 在成员函数内查找
- 在类内查找
- 成员函数定义之前的作用域查找
声明中使用的名字
如果某个成员的声明使用了类中尚未出现的名字,则编译器会在定义该类的作用域中继续查找
①声明中使用的名字,包括参数列表和返回类型使用的名字,都必须在使用之前确保可见。
②在类中,如果成员使用了外层作用域中的某个名字,而该名字代表了一种类型,则类不能再之后重新定义该名字
/*
第一点的demo
*/
typedef double Money;
string bal;
class Account{
public:
Money balance(){return bal;} //在类的作用域中找不到Money,继续扩大查找范围,找到typedef
private:
Money bal; //成员函数在类都可见时才被处理,所以返回成员bal。而非外层string类的bal
}
/*
第二点的demo
*/
typedef double Money;
class Account{
public:
Money balance(){return bal;}
private:
typedef double Money; //不能重新定义Money
Money bal;
}