7.4 类的作用域

名字查找的过程:(查找匹配的声明)

  1. 在名字所在块中寻找语句,查找使用名字之前出现的声明。
  2. 如果没找到,查找外层作用域
  3. 还没找到就报错

类的定义分为两步处理:

  1. 首先编译成员的声明
  2. 直到类完全可见之后,才编译函数体

成员函数中的名字查找:

  1. 首先在函数内查找该名字的声明
  2. 如果没在函数内找到,在类中所有的成员查找。
  3. 类内没有找到该名字的声明,则去上层的作用域查找。

编译器处理完类的全部声明之后才会处理成员函数的定义,所以它可以使用类中定义的任何名字。
类的声明中使用的其他名字包括返回值类型和参数列表使用的名字,都必须在使用前确保清晰可见。

typedef double Money;
string bal;
class Account {
    public:
        Money balance() {return bal; }
    private:
        Money bal;
}

这个例子中,编译器遇到Money后,会查找到typedef double Money;但在函数体内的bal使用的是Money bal;而不是string类型的bal。因为编译器处理完类的全部声明之后才会处理成员函数的定义

如果成员使用过外层作用域的某个名字,则这个类型不能重复定义在内层。

typedef double Money;
string bal;
class Account {
    public:
        Money balance() {return bal; } // 使用了外层的Money
    private:
        typedef double Money; //报错,不能重复定义Money
        Money bal;
};

一般不建议成员函数的参数使用其他成员的名字:

int height;
class Screen {
    public:
        typedef std::string::size_type pos;
        void dummy_fcn(pos height) { 
            cursor = width * height; 
            // 这里使用的height为参数声明中的height,函数声明位于函数的作用域内。
            // 如果想使用下面的height的话可以使用 this->height
        }
    private:
        pos cursor = 0;
        pos height = 0, width = 0;
};

尽管外层的对象被隐藏了,我们也可以通过::height来访问它。


原文地址:http://www.cnblogs.com/hy227/p/16852571.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性