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;
    //...
};

注意:类型成员一般出现在类的开始出,这样能确保所有使用该类型的成员都出现在类名的定义之后。

 

posted @ 2017-06-13 17:04  halo_vagabond  阅读(1528)  评论(0编辑  收藏  举报