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

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

  • 相关阅读:
    .Net开发笔记(二十一) 反射在.net中的应用
    .Net开发笔记(二十)创建一个需要授权的第三方组件
    .Net开发笔记(十九) 创建一个可以可视化设计的对象
    .net开发笔记(十八) winform中的等待框
    .Net开发笔记(十七) 应用程序扩展
    java连接https时禁用证书验证.
    How to disable SSL certificate checking with Spring RestTemplate?(使用resttemplate访问https时禁用证书检查)
    webpack打包调试react并使用babel编译jsx配置方法
    动态改变spring定时任务执行频率
    在java代码中,用xslt处理xml文件
  • 原文地址:https://www.cnblogs.com/cygalaxy/p/7002261.html
Copyright © 2011-2022 走看看