您的位置:首页 > 编程语言 > C语言/C++

【Effection C++】读书笔记 条款20~条款23

2017-05-18 22:52 253 查看

【Effective C++】Part4 设计与声明

条款20:宁以pass-by-reference-to-const替换pass-by-value

尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并且在有继承体系的时候,可以避免切割(将派生类以pass-by-value方式传递给基类的时候,可能会导致切割)。

以上规则并不适于内置类型,以及STL中的迭代器和函数对象。对他们而言,pass-by-value往往比较适当。

reference往往是以指针来实现的,因此pass-by-value通常意味着真正传递的是指针,而对于内置类型,pass-by-value的效率往往要比pass-by-reference的代价更高一些。对于STL迭代器和函数对象也是如此。

并不是所有的小型types都适用pass-by-value方式来进行传递。

许多对象,包括STL容器,虽然对象小,但是复制这种对象可能需要承担“复制那些指针所指的每一样东西”。

即使某些自定义对象和某些内置类型具有相同的底层表示,编译器却拒绝将自定义对象放到相应的缓存器中,但是却愿意队内置类型那么做。

条款21:必须返回对象时,别妄想返回其reference

在返回一个reference和返回一个object之间抉择的时候,所作的工作就是挑出行为正确的那个。

绝不要返回pointer或reference指向一个local statck对象,或返回reference指向一个heap-allocated对象,或返回pointer或reference指向一个local static对象而且有可能同时需要多个这样的对象。

条款22:将成员变量声明为private

将成员变量声明为private的原因:

语法一致性,如果将成员变量全部设为private,那么客户只能通过成员函数来访问成员变量,那么客户在使用中就无需考虑在访问成员时候是否需要使用圆括号。

使用函数可以让我们对成员变量的处理有着更加精确的访问控制。

封装。通过函数访问成员变量,如果后续改为某个计算来替换这个成员变量,而class客户则不会察觉到内部的变化。将成员变量隐藏在函数接口的背后,可以为“所有可能的实现”提供弹性。

对于protected成员变量而言,其的封装性并不比public更好。

所以:

切记将成员变量声明为private。这棵赋予客户访问数据的一致性,可细微划分访问控制,保证约束条件,并提供class设计者以充分的实现弹性。

protected成员对象并不比public对象更具有封装性。

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

封装性更大。non-member,non-friend函数比member函数和friend函数具有更大的封装性,因为它们绝不会访问到class的private成员。所以当class的private成员被更改而其public接口不变时,就会有越少的代码受到影响。

non-member函数可允许class相关机能有较大的包裹弹性,从而会有较低的编译相依度。

将non-member函数组合在一个namespace内,但是根据non-member函数的和对应类的相关性不同,而存放在不同的头文件中。要知道,namespace和classes不同,前者可以跨越多个源码文件而后者不能。客户则按照自己的需求不同,来包裹不同的头文件,客户只需要对它们使用的那一小部分系统形成编译相依。

这是一个非常值得学习的技术。正如C++标准库的组织方式一样,标准程序库并不是拥有一个庞大的\

// 头文件webbrowser.h
namespace WebBrowserStuff
{
class WebBrowser(); // 核心功能
void ClearWebBrowser(WebBrowser& w); // non-member non-friend函数
}

// 头文件webbrowserbookmarks.h
namespace WebBrowserStufff
{
…// 与书签相关的函数
}

// 头文件 webbrowsercookies.h
namespace WebBrowserStuff
{
…// 与cookie管理相关的函数
}


不同的WebBrowser处理函数被包裹在相同的命名空间,但是又存放在不同的头文件中,使得用户可以按照自己的需求来选择。

最后:

宁可拿non-member non-friend函数来替换member函数。这样做可以增加封装性,包裹弹性和机能扩充性。

参考文献

本篇文章主要是为了自己的学习总结,如果觉得不够详尽,请参考原书,或者下面的文献。

读书笔记Effective_C++条款二十三:宁以non-member、non-friend替换member函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  effective-c++ c++