共读Primer64.[7.3]类类型 Page249

Posted chattyku

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共读Primer64.[7.3]类类型 Page249相关的知识,希望对你有一定的参考价值。

类类型

对于类来说每个类的定义都是唯一的类型,即使两个类的成员完全一样,他们仍然是不同的类型

struct First
{
    int memi;
    int getMem(){return memi;};
};

struct Second
{
    int memi;
    int getMem(){return memi;};
};

First obj1;
Second obj2 = obj1; // 两个不同的类型无法进行赋值操作

类的声明

同函数一样,类也可以只声明而不定义,这种语法的常用场景是在使用类的地方类暂时不可见,

我们把这种声明叫做前向声明,那么在定义之前它将是一个不完全类型

class Screen;

// 一个典型的双向链表节点定义
class Link_screen
{
    Screen *window;    // 不完全类型可以使用指针
    Link_screen *next;    // 类在内部不能包含自己,但可以包含自己的指针,因为在类定义完成前,它属于不完全类型
    Link_screen *prev;
};

不完全类型可以定义指针或引用,也可以作为参数或返回值参与函数声明,不可参与定义。

友元

class Screen
{
    friend class Window_mgr; // 声明友元,在Window_mgr类可以使用私有属性
private:
    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
};

class Window_mgr
{
public:
    using ScreenIndex = std::vector<Screen>::size_type;
    void clear(ScreenIndex);
private:
    std::vector<Screen> screens{Screen(24, 80,  )};
};
void Window_mgr::clear(ScreenIndex i)
{
    Screen &s = screens[i];
    s.contents = string(s.height * s.width,  );
}

// 在软件设计中有最小授权的原则,所以我们应该将友元的范围仅限定在clear这个成员函数中。
class Screen
{
    // 这里需要注意的一点是,这条声明应该在被声明函数可见的前提下
    // 也就是说该声明应该在Window_mgr声明完成后
    friend void Window_mgr::clear(ScreenIndex); // 声明友元,使clear函数可以使用私有属性
private:
    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
};

 

友元的声明不具有传递的特性

也就是说每个类都只单独维护它自己的友元类或函数。

 

以上是关于共读Primer64.[7.3]类类型 Page249的主要内容,如果未能解决你的问题,请参考以下文章

共读Primer49.[6.3]返回类型和return语句--关于返回值 Page201

共读Primer51.[6.3]返回类型和return语句--列表初始化返回值 Page203

共读Primer53.[6.4]函数重载 Page207

共读Primer46.[6.3]参数传递--main函数处理参数 Page196

C++ Primer 第 5 版联合和类类型成员

c++primer第二章读书笔记---变量和基本类型