每日看点!Effective C++ 第二十三条 Prefer non-member non friend functions to me
来源:哔哩哔哩    时间:2023-01-22 18:08:47


【资料图】

宁以 non-member non-friend 函数替换 member 函数

下面有实例,三个对浏览器的操作

现在需要一个函数合并三个操作,有两种选择,一种是 member 另一种是 non-member non-friend

前面学过,面向对象守则要求数据应该尽可能被封装,如果使用 member 函数 clearEverything 那么封装度其实低于 non-member non-friend 函数 clearBrowser。non-member non-friend 函数的编译相联度更低,越多的内容被封装,能被看见的东西就越少,我们就能够越自由的改变内容(由条款22可知)。member 函数可以使用 private 函数、enums、typedefs,但是 non-member non-friend 函数就不能,二者提供的功能相同,non-member non-friend 不会增加 class 内 private 成分的函数数量,所以 non-member non-friend 使得 WebBrowser 具有更好的封装性。这点要区分清楚,non-member non-friend 而不是 non-member ,因为 friend 函数同 private 函数一样可以调用 private 函数、enums、typedefs,不能增加封装性。

使用  non-member non-friend 还有一个好处,可以降低编译相依关系,比如本案例中三个函数,我只需要使用其中一个,但是 class 中的函数会整体定义,无法分割。non-member non-friend 可以按照如下方式分割:

可以按照 namespace 分离到三个文件,假如我只需要使用 cookie 的内容,我就只需要包含file 1 和 file 2 头文件,不需要包含 file 3. STL 标准库就是如此,我不需要 list 我就不 #include <list>, 我需要 vector 我就 #include <vector> , 二者都在 std 空间下,可以做到分离使用。因此,class 的使用对于客户来说不可拓展,即使客户能够通过继承来产生 Derived,但是无法访问 Base 中被 private 修饰的成员,扩展性就差了许多。

上一篇:

下一篇:

X 关闭

Copyright   2015-2022 大众数码网版权所有  备案号:豫ICP备20014643号-14   联系邮箱: 905 14 41 07@qq.com