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

这样做的第一个理由是增加封装性,咳咳,这听起来有点矛盾,因为non-member且non-friend成员函数要想处理某个类中的数据的话,就得看到(即能访问)该类中的数据,那么数据就得是public的。这明显破坏了封装。嗯,解释一下,不是每个函数都要明确看到数据才能处理,它可以调用类中的一序列public函数来完成任务,这些public函数可以明确地看到类中的数据,如果我们把调用他们的函数作为member函数的话,那么可以明确看到类中数据的函数的数量就会增加1,而把它作为一个non-member且non-friend函数的话,并以类对象作为它的参数的话,这不会增加可以看到类数据的函数的数量。因此,使用non-member且non-friend函数增加了封装性。

这样做的第二个理由是拥有比较大的弹性,便于扩充。假设类A中有许许多多与类A表示的概念相关的方法,通过分组,重新组合可以实现其他功能或是提供便利函数,比较自然的做法就是另写一个头文件,在头文件里写出想要的函数,然后让这个函数以A的一个对象(引用)作为参数,在函数里组合A的功能,并让函数处于同一命名空间。如果发现新功能,再写一个头文件,重复刚才描述的步骤即可。这样用户想要哪个功能,包含相应的头文件就好了。命名空间可以分散在不同的文件里,而如果作为class的成员函数,是不能实现这样的分割的。

时间: 2024-11-05 14:39:09

宁以non-member且non-friend替换member函数的相关文章

条款23:宁以non-member, non-friend,替换member函数。

考虑下面这种经常出现的使用方式: class webBroswer{ public: ... void clearCache(); void clearHistory(); void removeCookies(); ... }; 那么很自然的就会想到增加这么一种清理方式: class WebBrowser{ public: ... void clearEverything(); }; 或者是这么一种清理方式: void clearBrowser(WebBrowser & wb) { wb.cl

Effective C++:条款23:宁以non-member、non-friend替换member函数

(一) 有个class来表示网页浏览器: class WebBrowser { public: void clearChache(); void clearHistory(); void removeCookies(); }; 许多用户会想一整个执行所有这些动作,因此WebBrowser也提供这样一个函数:clearEverything class WebBrowser { public: void clearChache(); void clearHistory(); void removeC

[023]宁以non-member、non-friend替换member函数

作者在这一节中花了大幅度的篇幅来介绍为什么最好使用non-member.non-friend函数. 思路如下: 场景:如果有一个class用来表示网页浏览器,那么清楚缓存及历史记录的时候,我们可能定义下面的类: class Web { public: void clearCache(); void clearCookies(); void clearHistory(); } 但是也有可能用户需要一下子全部清除这些信息,于是我们再定义下面这个成员函数: class Web {public: voi

Reading Effictive java: static member class (SMC) and nonstatic member class(NSC)

Misunderstanding of static member class : For most programmers, comparing to SMC ,we may be more familiar with static field . so we may analogously guess how SMC works according to static field's feature. That leads to a misunderstanding.--SMC may on

读书笔记_Effective_C++_条款二十三:宁以non-member、non-friend替换member函数

有下面一种情况 class A { private: int a; int b; public: A(int x, int y) :a(x), b(y){} void a_display(){ cout << a << endl; } void b_display(){ cout << b << endl; } }; 你想输出全部的时候 member函数情况 void display(){cout<<a<<b<<endl;

Effective C++ 条款23 宁以non-member,non-friend替换member函数

1. 面向对象的真实意义并非是数据以及操作数据的函数应该被捆绑在一起,而是要求数据应该尽可能地被封装.封装意味着数据的不可见,越多的东西被封装,用户对其直接的接触就越少,用户代码和被封装内容的编译相关度就越低,"包裹弹性"就越高,也就是说,封装性越好,对代码的更改所造成的影响就越低. 2. non-member-non-friend函数实际上比public-member和friend函数要高,因为前者无法访问类的private对象,而后者可以访问类的任何对象,这显然降低了数据的封装性(

jquery 替换元素函数

1.replaceWith()使用括号内的内容替换所选择的内容.$("#div").replaceWith("<div id="div2">div2</div>");使用方法如上,将ID为div的元素替换为ID为div2的DIV元素. 2.replaceAll()将选择的内容替换到括号内的选择器.$("<div>替换后的内容</div>").replaceAll("p&

php替换字符串函数strtr()和str_repalce()区别

php中替换函数主要有strtr(),str_repalce()这两个函数,但你们都知道他们这两个函数的区别和用法吗? 先来看看这个php字符串替换函数 strtr()的两种用法: strtr(string,from,to) 或者strtr(string,array) 首先针对strtr函数第一种方式: 我们看看下面的举例: <?phpecho strtr("I Love you","Lo","lO");?> 得到的结果是: I lO

[C++] static member variable and static const member variable

static member variable[可读可写] 可以通过指针间接修改变量的值 static const member variable[只读] 压根就不可以修改变量的值,会报错