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

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

  • 相关阅读:
    Go 函数方法
    rz上传文件乱码
    pip问题:ImportError: cannot import name main
    docker启动报错 docker: Error response from daemon: OCI runtime create failed: container_linux.go:348
    python遍历列表删除多个元素的坑
    python写入csv文件时的乱码问题
    python中的exec()函数和eval()函数
    tornado的IOLoop.instance()方法和IOLoop.current()方法区别
    安装mysql-python时报错
    python将科学计数法表示的数值的字符串转换成数值型数据
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7002261.html
Copyright © 2011-2022 走看看