C++ 程序员应该使用哪些 C++ 习语? [关闭]

Posted

技术标签:

【中文标题】C++ 程序员应该使用哪些 C++ 习语? [关闭]【英文标题】:What C++ idioms should C++ programmers use? [closed] 【发布时间】:2010-12-18 02:13:54 【问题描述】:

C++ 程序员应该知道哪些 C++ 习语?

我所说的 C++ 习语,是指设计模式或做某些事情的方式,它们仅适用于 C++,或者比大多数其他语言更适用于 C++。

为什么要使用成语,成语有什么作用?

【问题讨论】:

你能用那么多其他语言做 RAII 和 PIMPL 吗? 你不需要非 GC 语言,参见例如C# 和常见的using(A a = new A()) ... 使用IDisposable @gf。真的。但这只是比使用 try catch finally 来实现 RAII 更漂亮。 RAII 应该不需要对象用户的任何操作。 C++ 对 RAII 所做的事情是将正确使用的责任推给类的设计者而不是类的用户。 @Martin:好点,不知何故,我不认为设计方面的执行是 RAII 的一个属性。 我不会将 C# 的 using 语句视为 RAII 的示例。问题是你仍然不能让对象管理资源,这是 RAII 的重点,你仍然需要在 create 对象时手动完成,你只是得到一些语法糖来让它看起来更好。 【参考方案1】:

到目前为止,学习和了解 C++ 独有的(几乎)唯一最重要的“模式”是RAII(资源获取即初始化)。

编辑:(回答编辑到问题中的额外问题)。您主要使用 RAII 来(半)自动化资源管理。最明显的用途是在拥有对象超出范围时释放对象拥有的资源,例如释放内存或关闭文件。

【讨论】:

+1。不幸的是名字最差的成语。 别误会我的意思,它是 C++ 中最重要的之一,但它甚至不是 C++ 独有的。虽然 C++ 已经让它出名了。 我认为这不是 C++ 独有的东西;相反,它是关于在 C++ 中普遍存在的东西;一些你在不知道的情况下无法真正得到的东西,你可能在其他一些语言中可以做到。 RAII 肯定是这样的。 RAII 是实现 /release 模式 / 的 C++ 方式。 C++ 之所以出名,是因为内存泄漏不会出现在 GC 语言中,而内存是迄今为止最明显的资源。不幸的是,这意味着不知道这个习语的人在管理数据库连接或套接字等方面遇到了麻烦……在我看来,“使用”结构是迟缓的,因为它把负担放在了每个用户而不是唯一的类作者身上:/跨度> 【参考方案2】:

这是一个list。如果我必须选择一对,我可能会选择 Curiously Recurring Template Pattern 或 Virtual Constructors。

【讨论】:

我经常参考的好清单;然而,奇怪的是,重复出现的模板在我的列表中的位置非常低,因为这是每个 C++ 程序员都需要知道的。 @Elemental - 同意。我可能误读了这个问题,但我认为它唯一提到了 C++,而 CRTP 在这方面似乎符合条件。【参考方案3】:

PIMPL,又名 P 指向 IMPL 元素?

【讨论】:

我个人讨厌它。 :// 技术上,你没有任何地方使用它。 :-) 不幸的是,二进制兼容性有时很重要,这是确保它的唯一实用方法。 它还显着减少了编译时间(通过减少显式依赖),天知道 C++ 程序员是如何受苦的! 另一方面,如果没有很长的编译时间,我们中的许多人将无法在 *** 上花费几乎那么多时间。【参考方案4】:

模板元编程。这很棒,因为它基本上是编译时的鸭子类型,因此您可以通过静态类型的速度获得鸭子类型的大部分灵活性。

【讨论】:

鸭子不能被录音。 +1 用于 duck 打字。我一直认为duck typing是SFINAE的运行时版本【参考方案5】:

如果您想充分利用 STL,那么迭代器和仿函数/函数对象是必不可少的习语。迭代器的使用也隐含地依赖于“半开范围”习语。

【讨论】:

非常真实!你听说过序列构造函数和转换构造函数吗? 你是说喜欢iota()吗?列表中的另一个遗漏是生成器对象。 老实说,我对iota()并不熟悉,但我已经发布了一个带有示例的答案。【参考方案6】:

利用强类型和const 正确性也非常有用。

我还禁止默认的复制构造函数和赋值运算符。我实际上超越了这一点,但这些是最常见的。我认为如果它们不是隐含的,生活会更轻松。

【讨论】:

【参考方案7】:

RAII、COW、pimpl、demeter 法则(不确定是否可以归类为成语)、类型特征和策略。 (COW 和 demeter 法则不限于 C++)

【讨论】:

Traits 是我在其他任何地方都没有见过的东西(但话说回来,我并没有那么努力地寻找)。

以上是关于C++ 程序员应该使用哪些 C++ 习语? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

我的工具箱中应该都有哪些现代 C++ 库? [关闭]

指向 C++ 中类的指针的 PIMPL 习语

C++,使用模板编程的术语/习语

如果我想修改声音文件并将其保存回来,我应该寻找哪些 C++ 库? [关闭]

C++ 克隆习语中协变返回类型的用处?

可以使用 while(file >> ...) C++ 习语在 Cython 中读取文件吗?