c++--类的作用域
类的作用域
定义在类外部的成员
注意:成员函数定义在类外部时,必须指明它是哪个类的成员(主要注意返回类型为类成员的成员函数)。
class Window_mgr { public: using ScreenIndex=vector<Screen>::size_type; ScreenIndex addScreen(const Screen&); //... private: vector<Screen> screens{Screen(24,80,' ')}; }; //注意此处,要指明ScreenIndex是哪个类的成员 Window_mgr::ScreenIndex Window_mgr::addScreen(const Screen &s) { screens.push(s); return screens.size()-1; }
名字查找(使用名字前,要有声明)
1.名字查找过程:
首先,在名字所在的块中寻找其声明语句,只考虑在名字的使用之前出现的声明;
继续查找外层作用域;
如果最终没找到,程序报错。
2.类的定义分两步处理:
首先,编译成员的声明;
直到类全部可见后才编译函数体。
3.类成员声明的名字查找:(类定义的第一步)
这种两阶段的处理方式值适用于成员函数中使用的名字。声明中使用的名字,包括返回类型或者参数列表使用的名字,都必须在使用前确保可见。如果某个成员的声明使用了类中尚未出现的名字,则编译器将会在定义该类的作用域中(只考虑成员使用前的声明)继续查找。
4.成员定义的普通块作用域的名字查找:(类定义的第二步)
成员函数中使用的名字解析过程:
首先,在成员函数内查找该名字的声明(还是只考虑该名字使用之前出现的声明);
在类内继续查找,类的所有成员都被考虑;
在成员函数定义之前的作用域内继续查找(提醒:成员函数可能定义在外部,这范围就大了)。
5.类型名要特殊处理:
在类中,如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能再之后重新定义该名字。
typedef double Money; class Account { public: Money balance(){return bal;} //使用外层作用域的Money private: typedef double Money; //错误:不能重新定义Money Money bal; //... };
注意:类型成员一般出现在类的开始出,这样能确保所有使用该类型的成员都出现在类名的定义之后。