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++工程师#
全部评论

相关推荐

评论
5
收藏
分享
牛客网
牛客企业服务