`
isiqi
  • 浏览: 16745774 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Item 23 多考虑“非成员、非友元”函数

阅读更多

为了提供一站式服务,定义一个“清除一切”的函数。下面是两种方案:

1> 成员函数

2> 非成员、非友元函数

这两种方式哪种更好?这要从面向对象的根本谈起。
所谓面向对象,并不是把操作和数据搞到类里越多,才是好的封装。封装,是针对数据来说的。
上面的成员函数,其实对数据的封装不算好。那个非成员非友元的“双非”函数,才是封装的较好的。不仅如此,它还为WebBrowser提供了更好的扩展性,减少了编译依赖。

先说封装。封装的越多,客户看见的就越少,从而程序员就有更多的空间去修改。
再说对象内部的数据。某个数据被访问的越少,被封装的就越完全,程序员也就有越多的修改权。
若数据声明为公有或protected,则有无穷多的函数访问它,就是无封装。
私有的成员,只有成员函数、友元函数可以访问。
第一种方法定义为成员函数,增加了访问次数,相当于减弱了封装。反之,双非函数是好封装。不过,可以把clearBrowser放到别的类里。那样做不算破坏WebBrowser的封装。

另外,像WebBrowser这样的类可能有很多“便利函数”,比如为书签、打印等工作提供快捷调用的函数。常见的作法是:

所有的便利函数,都在WebBrowserStuff这个名字空间里。
STL就是这样组织的。

分享到:
评论

相关推荐

    模板类友元函数的一个例子

    通过具体的源代码实现了一个模板类`store`,并定义了一个友元函数(重载了标准输出流操作符`),用以显示`store`类中的数据成员。 #### 详细解析 ##### 一、模板类 `store` `store` 是一个模板类,其功能是存储...

    C++primer sales_item

    3. **友元函数(Friend Function)**:`Sales_item`类声明了两个友元函数,`operator==`和`operator。友元函数不是类的成员,但被授予访问类私有和保护成员的权限。`operator==`用于比较两个`Sales_item`对象是否...

    Effective C++英文word版

    Item 19区分了成员函数、非成员函数和友元函数的使用场景。Item 20告诫避免在公有接口中使用数据成员,以保护数据安全。Item 21提倡尽可能使用`const`,以表达函数不会修改对象的意图。Item 22推荐使用传引用而非...

    Sales_item_C++_

    这两个函数通常不是成员函数,而是作为友元函数实现,因为它们需要访问类的私有成员。例如: ```cpp void read(std::istream &is, Sales_item &item) { double price = 0; is >> item.isbn >> item.units_sold >>...

    C++ PRIMER 4th Sales_item.h

    Sales_item 类定义了两个友元函数: * operator>>:用于从输入流中读取销售项目信息。 * operator用于将销售项目信息写入输出流中。 使用说明 Sales_item 类可以用于类似图书销售这样的应用场景中,用于记录和...

    effective c++ word版

    区分成员函数、非成员函数和友元函数(Item 19),有助于维持封装和职责分离。他还建议避免隐式类型转换(Item 20),以减少类型不匹配导致的错误。 这些知识点展示了从C语言向C++语言过渡时需要注意的重要原则,...

    Sales_item头文件

    在学习`Sales_item`时,你还会接触到C++的其他关键概念,如类的封装、构造函数、拷贝构造函数、友元函数、异常处理以及输入输出流的使用。这些都是C++编程的基础,对于理解更复杂的面向对象编程技巧至关重要。通过...

    Effective_C++

    - **Item19**: 区分成员函数、非成员函数和友元函数的作用和使用场景,合理安排它们在类中的位置。 - **Item20**: 尽量避免在公共接口中使用数据成员,保护类的内部状态,减少对外部的依赖。 - **Item21**: 尽可能...

    Sales_item.h-MSVisualStudio2012.zip

    4. **友元函数**:有时,为了实现某些功能,如比较两个`Sales_item`对象,可能会声明友元函数,如`bool compareIsbn(const Sales_item&, const Sales_item&)`。 5. **使用VS2012**:在MS Visual Studio 2012环境下...

    Sales-item.h与Version.h下载(C++Primer)

    4. **友元函数**: - `std::istream& operator>>(std::istream& is, Version& v)`:用于从输入流中读取版本信息。 - `std::ostream& operator(std::ostream& os, const Version& v)`:将版本信息写入输出流。 在...

    salesitem:C++ 入门中习题 1.20 和 1.21 的 sales_item 实现库

    总结来说,`sales_item`类的实现是C++学习过程中的一个重要实践,它涵盖了类的设计、构造函数、成员函数、友元函数、运算符重载以及文件I/O等核心概念。通过解决1.20和1.21这样的问题,初学者可以更好地理解和掌握...

    软件设计(II)教学课件:Chapter5 Classes and Objects.ppt

    静态数据成员的初始化在类外完成,而静态成员函数没有隐含的`this`指针,无法访问非静态成员。 传递对象到函数(§5.4)允许我们将对象作为参数传递给函数,或者在函数中返回对象。这涉及到对象的拷贝或引用传递,...

    C#编写图书馆管理系统源码

    - 同样的,`Item`类和`Magazine`类也定义了相应的友元函数。 4. **枚举(Enum)**: - `Magazine`类中定义了一个枚举类型`LANG`,用来表示杂志的语言类别,有中文(CHINESE)和英文(ENGLISH)两种。 5. **链表...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     7.1.3 定义类相关的非成员函数 234  7.1.4 构造函数 235  7.1.5 拷贝、赋值和析构 239  7.2 访问控制与封装 240  7.2.1 友元 241  7.3 类的其他特性 243  7.3.1 类成员再探 243  7.3.2 返回*this的成员函数...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

     7.1.3 定义类相关的非成员函数 234  7.1.4 构造函数 235  7.1.5 拷贝、赋值和析构 239  7.2 访问控制与封装 240  7.2.1 友元 241  7.3 类的其他特性 243  7.3.1 类成员再探 243  7.3.2 返回*this的成员函数...

    2023年面向对象程序设计复习辅导三.doc

    此外,还可以有友元函数,它可以从外部访问类的私有和保护成员。 总之,面向对象程序设计复习辅导三主要涵盖了函数的定义、参数传递、作用域和生存期等基础概念,这些都是理解和编写C++程序所必需的技能。通过深入...

Global site tag (gtag.js) - Google Analytics