文章目录
每个类都会定义它自己的作用域。在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问。对于类类型成员则使用作用域运算符访问。不论哪种情况,跟在运算符之后的名字都必须是对应类的成员。
作用域和定义在类外的成员
一个类就是一个作用域的事实能够很好地解释为什么当我们在类的外部定义成员函数时必须同时提供类名和函数名。在类的外部,成员的名字被隐藏起来了。
一旦遇到了类名,定义的剩余部分就在类的作用域之内了,这里的剩余部分包括参数列表和函数体。结果就是,我们可以直接使用类的其他成员而无须再次授权了。
名字查找与类的作用域
类的定义分两步处理:
- 首先,编译成员的声明。
- 直到类全部可见后才编译函数体。
编译器处理完类中的全部声明后才会处理成员函数的定义。
这种两阶段的处理方式只适用于成员函数中使用的名字。声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须在使用前确保可见。如果某个成员的声明使用了类中尚未出现的名字,则编译器将会在定义该类的作用域中继续查找。
//情况1 不报错
using hhdy=int;
string height;
class zwhy{
public:
//这里的类型hhdy是外层类型,int,height是内层的hhdy height,int类型。
hhdy balance(){return height;}
private:
//using hhdy = string; //此时hhdy会被重新定义为string类型
hhdy height;
} ;
//情况2 不报错
using hhdy=int;
string height;
class zwhy{
public:
//这里的类型hhdy是string类型,height是内层的hhdy height,string类型。
string balance(){return height;}
private:
using hhdy = string; //此时hhdy会被重新定义为string类型
hhdy height;
} ;
//情况3 报错
using hhdy=int;
string height;
class zwhy{
public:
//这里的类型hhdy是外层类型int,height是内层的hhdy height,是string类型,报错。
hhdy balance(){return height;}
private:
using hhdy = string; //此时hhdy会被重新定义为string类型
hhdy height;
} ;
总结一下:
成员函数{}内部的变量名字寻找:
- 先寻找成员函数自己上方的定义有无出现。
- 在类内的所有成员进行搜索,看有无出现。
- 在类外上方进行搜索,看有无出现。
对于类成员的搜索:
- 在类上方的定义进行搜索,看有无出现。
- 在类外上方进行搜索,看有无出现。