问题标签 [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 投票
1 回答
2835 浏览

c++ - 使用“不可复制”类时消除 GCC 警告

我有几个我不想被复制的类,其中一些类有指针数据成员。为了使这些类不可复制,我私下继承了以下类模板:

我这样使用:

这很好用,但是当我使用 -Weffc++ 编译时,我仍然收到以下警告:

为什么它仍然给我这个警告?

0 投票
10 回答
1497 浏览

c++ - 面试题;Effective C++ 的主题是什么?

在最近的一次工作面试中,我被问到以下问题:

您认为总结 Scott Meyers 的 Effective C++ 系列的主题/单词是什么?

你会怎么回答这个问题?

0 投票
3 回答
21284 浏览

c++ - 在头文件中将值设置为“const char *”是否合适

我见过人们使用 2 种方法来声明和定义char *.

方法1:头文件有以下内容

方法2:
头文件有以下声明:

cpp 文件具有以下定义:

  1. 方法1在某种程度上是错误的吗?
  2. 两者有什么区别 ?
  3. const char * const var我理解 " " 和 " "之间的区别const char * var。如果在上述方法中,如果const char * const var像方法 1 一样在标头中声明和定义“”,是否有意义?
0 投票
5 回答
440 浏览

c++ - C++:将 const 与 STL 迭代器一起使用

来自Effective C++,第 3 项

为了记住如何const应用,我曾经记住这篇文章中的以下内容

基本上,“const”适用于其最左边的任何东西(除非那里没有任何东西,在这种情况下,它适用于它最右边的任何东西)。

当我第一次阅读本书中的第 3 项时,我预计 case1 和 case2 会相反。

我应该将这种情况视为例外吗?还是我缺少一些更深层次的理解?

0 投票
4 回答
9922 浏览

c++ - 关于从基类向下转换到子类指针

静态检查工具显示违反以下代码:

错误消息: “CSplitFrame”类继承自“CWnd”类

描述:避免向下继承继承层次结构。此规则检测从基类指针到子类指针的强制转换。

好处:允许向下转换继承层次会导致维护问题,并且从基类向下转换总是非法的。

参考:

  1. Scott Meyers,“有效的 C++:50 种改进程序和设计的具体方法”,第二版,Addison-Wesley,(C) 2005 Pearson Education, Inc.,章节:“继承和面向对象的设计”,第 39 项
  2. JOINT STRIKE FIGHTER, AIR VEHICLE, C++ 编码标准第 4.23 章类型转换,AV 规则 178

您认为不从基类指针向下转换为子类指针是一个好习惯吗?为什么以及何时我应该遵守这条规则?

0 投票
4 回答
2967 浏览

c++ - 前向声明包括,在声明包括之上(ClassFwd.h + Class.h)

在 Effective C++(第 3 版)中,Scott Meyers 在第 31 条中建议类应该在其经典的声明 (.h) 和定义 (.cpp) 文件之上具有前向声明包含文件 (fwd.h),不需要完整定义的类可以使用,而不是前向声明自己。

我有点看到它的情况,但我真的不认为这是一个可行的选择......它似乎很难维护,相当矫枉过正而且几乎没有必要。

但是,我可以看到它用于模板前向声明,这是相当繁重的。但是对于简单的课程?似乎维护起来很痛苦,并且会创建大量几乎为空的包含文件,这些文件的用途非常小……值得麻烦吗?

这是一个例子:

我的问题

你们有什么感想?如果这是一个好习惯?

注意我最感兴趣的是这种做法的论点,看看我是否遗漏了一些能让我同意 Scott Meyers 的东西。

0 投票
1 回答
1118 浏览

c++ - 从派生类中调用运算符 =

这是来自有效 C++ 第 2 版 scott meyers 的第 16 项(第 70 页)

作者没有太多解释地写道,当基类运算符 = 以下列方式调用时

一些编译器(尽管错误地)拒绝这个,如果它operator =由编译器生成的(见第 45 条)所以更好地使用

在第 45 项中,他提到如果基类operator =是私有的,则派生类=无权调用它。

但在最初的问题中,编译器拒绝它,因为它是由编译器生成的(必须是公开的)

对此的任何帮助(链接)都会有所帮助。(谷歌这些类型的问题很难)

0 投票
7 回答
15735 浏览

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

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

  • 那么,第一个问题,他们不应该成为会员吗?

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

如果您可以访问这本书,您能否为我进一步澄清这些观点?

0 投票
2 回答
2170 浏览

c++ - Effective C++ 《35. 最小化文件之间的编译依赖》。今天还有效吗?

在本章中,Scott Meyer 提到了一些避免头文件依赖的技术。如果更改仅限于其他包含的头文件,主要目标是避免重新编译 cpp 文件。

我的问题是:

  • 在我过去的项目中,我从未关注过这条规则。编译时间不短但也不是不能忍受。这可能与我的项目的规模(或缺乏)有关。鉴于编译器技术的进步(例如 clang),今天这个技巧有多实用?

  • 我在哪里可以找到更多使用这种技术的例子?(例如 Gnome 或其他 OSS 项目)

PS我使用的是第二版。

0 投票
5 回答
4118 浏览

c++ - 有效的 C++:不鼓励受保护的继承?

我正在阅读 Scott Meyers 的Effective C++(第三版),在第32 条的一段中:确保公共继承是第 151 页的“is-a”,他发表了评论(我用粗体表示):

这仅适用于公共继承。只有当 Student 是公开派生自 Person 时,C++ 才会像我所描述的那样运行。私有继承意味着完全不同的东西(参见第 39 条),而受保护的继承是我至今仍无法理解的东西。

问题:我应该如何解释这个评论?Meyers 是否试图传达受保护的继承很少被认为有用并且应该避免?

(我已经阅读了 私有、公共和受保护继承之间的区别以及C++ FAQ Lite 的私有和受保护继承部分的问题,两者都解释了受保护继承的含义,但并没有让我深入了解何时或为什么它会很有用。)