侧边栏壁纸
博主头像
如此肤浅

但行好事,莫问前程!

  • 累计撰写 52 篇文章
  • 累计创建 6 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

条款23 宁以 non-member、non-friend替换member 函数

如此肤浅
2022-05-29 / 0 评论 / 0 点赞 / 31 阅读 / 745 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-06-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. 宁可拿 non-member non-friend 函数替换 member 函数。这样做可以增加封装性、包裹弹性(packaging flexibility)和机能扩充性。(详情参考书中内容)

问题描述

假设类 WebBrowser 有3个函数:

class WebBrowser {
public:
	...
    void clearCache();
    void clearHistory();
    void removeCookies();
    ...
};

当用户想一次性执行这3个函数时,有两种方式。
方式一是 WebBrowser 提供一个 member:

class WebBrowser {
public:
	...
    // 在下面函数种调用clearCache、clearHistory、removeCookies
    void clearEverything(); 
    ...
}

方式二是通过 non-member 函数:

void clearBrowser(WebBrowser& wb)
{
	wb.clearCache();
    wb.clearHistory();
    wb.removeCookies();
}

那么,member 和 non-member 哪种方式比较好呢?

答案:non-member 更好

  • 从封装的角度
    non-member 比 member 的封装性更好。对于对象内的数据,越多的代码(函数)能访问它,说明数据的封装性越低。

    条款22曾表明,成员变量应该是 private,如果不是,则有无限的函数能访问它们,毫无封装性。当你选择是使用 member 和 non-member、non-friend 中哪一个来访问 private 数据时,而且两者提供的功能相同,导致较大封装性的是 non-member 和 non-friend 函数。因为这样实现了功能的同时,没有增加能访问 private 变量的函数数量。

0

评论区