7.4 类的作用域
一个类就是一个作用域 ,在类中定义的类型,需要通过类作用域运算符访问。
class A{
public:
using pos = int;
};
//通过作用域限定符来访问
A::pos temp_a;
因为类本身就是一个作用域,所以我们在类外定义成员函数时,类的数据成员对我们来说是不可见的,所以在类外定义成员函数,需要加上加上类的作用域。
class A{
public:
using pos = int;
pos get_value(int pos);
};
//返回值类型需要加A::,函数体中的内容以及在类的作用域范围之内,所以不用加
A::pos A::get_value(int pos) {
//todo
}
我们会在函数名字前面加上A的作用域,表示这个函数是A中定义的,属于A的作用域范围,所以A::后面的内容,可以直接访问函数中的成员。
但是返回值类型在函数名的前面,所以如果成员函数在外部定义,则返回值类型在类的作用域之外,如果返回值类型使用了类中定义的成员,则要使用类作用域运算符。
练习
7.33
因为pos类型是在Screen类中定义的,从该成员函数的定义可以看出,这个成员函数是在类的外部定义的,而返回值类型pos,是在类中定义的,所以需要为返回值pos加上类作用域运算符。
Screen::pos Screen::size() const{
return height*width;
}
名字查找和类的作用域
所谓的名字查找,就是说我们定义一个变量,它是变量名,如果我们在某一个地方使用了变量名,我们需要知道这个变量名具体指的是哪个变量。
在没有学习类得知识时,名字查找按照这样的流程。
1.首先在定义变量的块中寻找声明语句,这只能从使用该变量的前面的语句开始找。
2.如果没有找到,就在外层作用域找,只能从定义该块的前面的语句中找。
3.如果没有找到就再