C++ Primer第七章④
C++ Primer
第七章 类
类的作用域
每个类都有自己的作用域。下面这句话有点拗口:在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符.(这是个点)来访问:
//我们还是使用前面的屏幕类Screen为例
Screen::pos ht = 24, wd = 80;
Screen scr(ht, wd, ' '); //调用构造函数实例化一个对象scr
Screen *p = &scr; //p是指向对象的指针
char c = scr.get(); //通过scr对象,调用成员函数get去获取字符
c = p->get(); //通过指针调用get函数
我再来给Window_mgr窗口管理类加个成员函数:
class Window_mgr
{
public:
//向窗口添加一个Screen,返回它的编号
ScreenIndex addScreen(const Screen&);
};
Window_mgr::ScreenIndex Window_mgr::addScreen(const Screen &s)
{
screens.push_back(s);
return screens.size()-1;
}
这个函数名前面有域作用符,所以,后面的形参和函数体都在类内,可以直接使用screens等成员变量,而返回类型在函数名之前,不算在类内,它要访问在类内定义的ScreenIndex就必须加上域作用符。
名字查找与类作用域
用于类成员声明的名字查找
直接看代码解释比较有效:
typedef double Money;
string bal = "a";
class Accout
{
public:
Money balance()
{
return bal;
}
private:
Money bal = 1;
typedef double Money; //这样不行的,重新定义类型不能覆盖,是错误的行为
//但是编译器并不会报错,所以要自己小心
};
balance函数输出的是1,可以直接理解为局部变量bal覆盖了外部变量bal。
没事找事的C++
看看代码就知道我为啥这么说了:
int height = 1;
class Screen
{
public:
typedef string::size_type pos;
void f(pos height)
{
cursor = width * height; //这里的height是多少
}
private:
pos cursor = 0;
pos height = 0, width = 0;
};
height是1,解释是这样的,height是形参,是可以从外面传进来的,编译器在编译f函数时,会去找这个height,这时候它还不知道下面private里面有个height(当然我是这么解释的),然后它就用了上面那个height=1,我们能不能强行用类里面的height呢,当然可以:
void Screen::f(pos height)
{
cursor = width * this->height;
//或者
cursor = width * Screen::height;
}
当然,我们并不建议这么写,不过你得懂,这就是C++烦人的地方。
那要是我就想用外面的那个全局变量妖艳***呢?也行。。。
void Screen::f(pos height)
{
cursor = width * ::height; //用的是外面那个全局的
}
当然,我的建议就是,那么多名字,取个不一样的就好了。
#C++工程师#