码迷,mamicode.com
首页 > 其他好文 > 详细

【共读Primer】64.[7.3]类类型 Page249

时间:2018-09-20 11:11:22      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:操作   赋值   需要   ring   end   vat   函数声明   双向   定义   

类类型

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

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;
};

 

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

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

 

【共读Primer】64.[7.3]类类型 Page249

标签:操作   赋值   需要   ring   end   vat   函数声明   双向   定义   

原文地址:https://www.cnblogs.com/ChattyKu/p/9678805.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!