zoukankan      html  css  js  c++  java
  • 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;
        //...
    };

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

  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7002261.html
Copyright © 2011-2022 走看看