问题标签 [effective-c++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
266 浏览

c++ - 类似函数的宏和奇怪的行为

我已经开始阅读 Effective C++ 并且在第 2 项中的某个时间点,提到了以下内容:

在这里,在调用 f 之前 a 增加的次数取决于与之比较的对象!

确实,如果我在 中使用简单的打印语句f,第一次调用会打印 7 ,但我终其一生都无法弄清楚原因。我错过了一些明显的东西吗?

0 投票
5 回答
712 浏览

c++ - 如何避免将句柄返回到对象内部 - Item 28 Effective C++

Effective C++ 的第 28 条说avoid returning "handles" to object internals这个问题展示了如何通过考虑封装来设计你的代码来做到这一点,以避免意外暴露你的类的内部。

我的示例涉及一个数据数组,由于内存是我想避免使用的问题std::vector(和 Boost 库)。

在这里使用数组是我的代码的一个非常简化的版本:

我知道使用constwithget_data()并不安全。如果我使用的是向量,我可以像上面的示例问题一样复制它,但是由于我想避免这种情况,我想知道如何最好地设计我的类来避免这种潜在的危险情况?

0 投票
3 回答
73259 浏览

c++ - 有效的 C++ 仍然有效吗?

根据我在这篇文章中看到的内容,我决定开始阅读《Effective C++ 》一书。

但是现在由于 C++11 带来了许多新功能,并且一些好的做法发生了变化,我不确定这是否真的是一个好主意。C++11 的出现是否已经弃用了 Effective C++ 中包含的任何建议?如果是这样,我应该避免哪些话题?

0 投票
7 回答
8026 浏览

c++ - 为什么 argc 不是常数?

正如Effective C++ Item#3 所说的“尽可能使用 const”,我开始思考“为什么不制作这些‘常量’参数const?”。

是否存在在程序中修改的值的任何情况argc

0 投票
5 回答
1990 浏览

c++ - 在成员初始化列表中填充 std::array

以下代码有效,但我想避免警告:

警告:“fitness::vect_”应该在成员初始化列表中初始化[-Weffc++]

当它使用g++ -Weffc++开关编译时:

我应该忽略警告吗?有没有办法填写vect_构造函数初始化列表(不改变其类型)?

0 投票
4 回答
371 浏览

c++ - 在 C++ 中返回局部变量(Effective C++ 第 3 版中的规则 21)

众所周知,由于作用域,从 C++ 中的函数返回局部变量是不安全的。在 Effective C++ 第三版中,Scott Meyers 在第 101 页的第 21 项中讲述了这个问题。然而,他总结说,正确的决定是这样写:

这不也是一种不好的做法,而且这个功能是不安全的吗?

UPD:谢谢大家的解释。

0 投票
4 回答
2601 浏览

c++ - 为什么我应该更喜欢“显式类型的初始化程序”习语而不是显式给出类型

我最近从 Scott Meyers 那里购买了新的 Effective Modern C++ 并正在阅读它。但是我遇到了一件完全让我烦恼的事情。

在第 5 项中,斯科特说使用auto是一件很棒的事情。它节省了输入,在大多数情况下为您提供正确的类型,并且它可能不受类型不匹配的影响。我完全理解这一点,也认为这auto是一件好事。

但是在第 6 项中,斯科特说每个硬币都有两个面。同样,也可能会auto推导出完全错误的类型,例如代理对象。

你可能已经知道这个例子:

到现在为止还挺好。

但 Scott 对此的解决方案是所谓的“显式类型初始化习语”。这个想法是,像这样在初始化程序上使用 static_cast :

但这不仅会导致更多类型的输入,而且意味着您还显式地声明了应该推导的类型。您基本上失去auto了显式给定类型的两个优点。

谁能告诉我,为什么使用这个成语是有利的?


首先要澄清一下,我的问题旨在说明我为什么要写:

代替:

@Sergey 提供了一篇关于GotW的关于该主题的好文章的链接,该文章部分回答了我的问题。

指南:考虑声明局部变量 auto x = type{ expr }; 当您确实想明确提交类型时。显示代码显式请求转换是自文档化的,它保证变量将被初始化,并且不会允许意外的隐式缩小转换。仅当您确实想要显式缩小时,才使用 () 而不是 {}。

这基本上让我想到了一个相关的问题。我应该选择这四种选择中的哪一种?

第一名仍然是我的最爱。它不像其他三个那样打字和明确。

关于保证初始化的观点并不真正成立,因为无论如何我都在声明变量,而不是在我以某种方式初始化它们之前。而关于缩小范围的另一个论点在快速测试中没有得到很好的解决。

0 投票
1 回答
2271 浏览

c++ - C++ 编译器创建的符号表

我正在阅读Effective C++,第 3 版和第 2 项(更喜欢 const、枚举和内联而不是 #defines),Scott Meyers 提到了符号表:他解释说#defines可能不会出现在符号表中

根据这里的答案,一些建议的阅读,以及维基百科的文章,我将符号表定义如下:由于编译器只为每个翻译单元创建目标文件,我们仍然需要一种方法来引用符号之间的符号翻译单位。这是使用为每个目标文件创建的表来完成的,以便可以在稍后阶段定义符号 - 在从目标文件创建可执行文件/库时由链接器定义。在链接过程中,符号被链接器替换为相应的内存地址。

这是我想知道的:

  • 我上面的解释正确吗?
  • 链接后,一旦解析了内存地址,我认为不需要符号表吗?也就是说,我认为符号表在可执行文件/库中不可用;那是对的吗?
  • 我怀疑符号表对其他编译器任务也有用吗?诸如识别命名冲突之类的东西?
  • 上述符号表与导出表不同。至少在 Visual C++ 的上下文中,导出表定义了在库外显式声明为可见的符号。我想在某种意义上这是一个符号表——但与 Scott 所指的符号表无关。
  • 符号表还有什么有趣的地方吗?也就是说,我应该拥有关于符号表的任何其他见解吗?

感谢您的时间和贡献。

0 投票
1 回答
1245 浏览

c++ - C++ 显式声明在默认构造函数中触发警告

在一个Code::Blocks v13.12项目中,我有一个名为的类Drawable,它有一个名为rotation.

我注意到明确声明rotationinsideDrawable的默认构造函数会触发以下警告:

'Drawable::rotation' 应该在成员初始化列表中初始化 [-Weffc++]

但是,rotation在其定义旁边显式声明并不能做到这一点。

我想知道的是,为什么会这样:

给我一个成员初始化警告,而这个:

还有这个:

编译没有抱怨?

0 投票
2 回答
87 浏览

c++ - 使用函数对象 tr1::function<> 调用仿函数

我尝试实现 Scott Mayer 书中的代码示例,示例是关于通过函数对象调用函子

头文件 gameCharachter.h

main.cpp 是:

为什么 function<> 对象拒绝在 healthvalue() 中调用 operator() 函数