类的作用域详解(C++ primer7.4笔记)
7.4 类的作用域
名字查找的过程:(查找匹配的声明)
- 在名字所在块中寻找语句,查找使用名字之前出现的声明。
- 如果没找到,查找外层作用域
- 还没找到就报错
类的定义分为两步处理:
- 首先编译成员的声明
- 直到类完全可见之后,才编译函数体
成员函数中的名字查找:
- 首先在函数内查找该名字的声明
- 如果没在函数内找到,在类中所有的成员查找。
- 类内没有找到该名字的声明,则去上层的作用域查找。
编译器处理完类的全部声明之后才会处理成员函数的定义,所以它可以使用类中定义的任何名字。
类的声明中使用的其他名字包括返回值类型和参数列表使用的名字,都必须在使用前确保清晰可见。
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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。