【共读Primer】64.[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;
};

 

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

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

 

转载于:https://www.cnblogs.com/ChattyKu/p/9678805.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值