本条款的核心就是告诉我们用非成员函数和非友元函数比用成员函数好!主要是从封装的角度出发才有这个结论的!下面来看理论阐述和解释
1.首先看如下的代码
class WebBrowser
{
public:
void claercache();
void clearhistory();
void removecookies();
};
加入上面的这个类中的函数要一次性执行上面三个函数,我们可以用一个成员函数来调用他们,代码如下:
class WebBrowser
{
public:
void cleareverything()//成员函数
{
claercache();
clearhistory();
removecookies();
}
};
当然也可以用非成员函数调用他们,代码如下
void cleareverything(WebBrowser& s)//非成员函数
{
s.cleareverything();
s.cleareverything();
s.cleareverything();
}
哪种方法好呢?现在就让我们来好好讨论一下!
1.首先,对于面向对象守则要求,数据以及操作数据的那些函数应该被捆绑在一起,这意味这使用成员函数更好的 选择,但是这是一个不正确的建议,对于基于面向对象真实意义的一个误解。面向对象守则要求数据尽可能的被封装,但是很明显成员函数的封装性就比非成员函数低。并且非成员函数对于类的相关机能有较大的包裹性,最终导致较低的编译依赖度,增加类的可延展性,所以在很多方面非成员函数比成员函数在里更加的合适!
2.首先对于封装解释:如果某些东西被封装,意味着不可见,越多的多的东西被封装意味着越少的人看到他,这样就有更大的弹性去改变它。因为我们的改变只是影响部分客户!所以我们推崇封装!注
对于一个数据来说,越少的代码可以看见他(访问他),则他的封装性就越高,对于封装性的高低我们就用访问他的函数数量来衡量,越多的函数可以访问他,则他的封装性就越低,否则越高,当然这只是一种粗糙的衡量!(这里的数据强调的是private的数据)一个成员函数不仅可以访问私有成员,还可以访问私有的函数等等一些列东西,所以相比较非成员函数和非友元函数所能提供的封装性更高,因为他们不能访问私有成员的任何东西,即不增加访问class中private的函数数量,因为不降低数据的封装性。这就是为什么非成员函数和非友元函数比成员函数更加的有封装性了!