gpt4 book ai didi

c++ - Effective C++ Item 23 Prefer non-member non-friend functions to member functions

转载 作者:IT老高 更新时间:2023-10-28 12:35:26 31 4
gpt4 key购买 nike

在对类设计的一些事实感到困惑时,特别是函数是否应该是成员,我查看了 Effective c++ 并找到了第 23 条,即 Prefer non-member non-friend functions to member functions。使用 Web 浏览器示例第一手阅读该内容是有一定道理的,但是该示例中的便利函数(在书中像这样命名非成员函数)会改变类的状态,不是吗?

  • 那么,第一个问题,他们不应该是成员(member)吗?

  • 进一步阅读,他考虑了 STL 函数,实际上某些类没有实现的一些函数是在 STL 中实现的。按照本书的思路,它们演变成一些方便的函数,这些函数被打包到一些合理的命名空间中,例如 std::sortstd::copy from algorithm。例如,vector 类没有 sort 函数,而使用 STL sort 函数,因此它不是 vector 类的成员。但是也可以将相同的推理扩展到 vector 类中的其他一些函数,例如 assign ,这样它也不能作为一个成员来实现,而是作为一个便利函数来实现。然而,这也会改变对象的内部状态,比如它所操作的排序。那么这个微妙但重要(我猜)的问题背后的基本原理是什么。

如果你能接触到这本书,你能帮我解释一下这些要点吗?

最佳答案

没有必要访问这本书。

我们在这里处理的问题是依赖重用

在设计良好的软件中,您会尝试将项目彼此隔离以减少依赖关系,因为当需要更改时,依赖关系是一个需要克服的障碍。

在设计良好的软件中,您应用 DRY 原则(不要重复自己),因为当需要进行更改时,必须重复十几个是痛苦且容易出错的不同的地方。

“经典”OO 思维方式越来越不擅长处理依赖关系。通过直接依赖于类内部的大量方法,最轻微的变化就意味着整个重写。不必如此。

在 C++ 中,STL(不是整个标准库)的设计明确目标是:

  • 削减依赖关系
  • 允许重复使用

因此,容器公开了定义良好的接口(interface),这些接口(interface)隐藏了它们的内部表示,但仍然提供对它们封装的信息的充分访问,以便可以在它们上执行算法。所有修改都是通过容器接口(interface)进行的,以保证不变量。

例如,如果您考虑 sort 算法的要求。对于 STL(通常)使用的实现,它需要(来自容器):

  • 有效访问给定索引处的项目:随机访问
  • 交换两个项目的能力:非关联

因此,任何提供随机访问且非关联的容器(理论上)都适合通过(例如)快速排序算法进行有效排序。

C++ 中有哪些容器可以满足这个要求?

  • 基本的 C 数组
  • deque
  • vector

如果您注意这些细节,可能编写的任何容器。

为每一个重写(复制/粘贴/调整)sort会很浪费吗?

请注意,例如,有一个 std::list::sort 方法。为什么 ?因为 std::list 不提供随机访问(非正式地 myList[4] 不起作用),因此 sort from 算法不适合.

关于c++ - Effective C++ Item 23 Prefer non-member non-friend functions to member functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5989734/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com