问题标签 [c++-faq]

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 投票
8 回答
129104 浏览

c++ - 为什么标头中有 C++ 内联函数?

注意这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么它们以它们的方式完成。

类成员函数的声明不需要将函数定义为inline,它只是函数的实际实现。例如在头文件中:

那么为什么类函数的内联实现必须在头文件中呢?为什么我不能将内联函数放入.cpp文件?如果我尝试将内联定义放入.cpp文件中,我会收到如下错误:

0 投票
3 回答
30288 浏览

c++ - 如何让 IOStream 表现更好?

大多数学习 C 的 C++ 用户更喜欢使用printf/scanf系列函数,即使他们使用 C++ 进行编码也是如此。

虽然我承认我发现界面方式更好(尤其是类似 POSIX 的格式和本地化),但似乎压倒性的问题是性能。

看看这个问题:

如何加快逐行读取文件的速度

似乎最好的答案是使用fscanf,并且 C++ifstream始终慢 2-3 倍。

我认为如果我们可以编译一个“技巧”存储库来提高 IOStreams 的性能,那会很棒,什么有效,什么无效。

需要考虑的要点

  • 缓冲 ( rdbuf()->pubsetbuf(buffer, size))
  • 同步 ( std::ios_base::sync_with_stdio)
  • 语言环境处理(我们可以使用精简的语言环境,还是完全删除它?)

当然,也欢迎其他方法。

注意:提到了 Dietmar Kuhl 的“新”实现,但我无法找到有关它的许多细节。以前的引用似乎是死链接。

0 投票
7 回答
104575 浏览

c++ - “STL”和“C++ 标准库”有什么区别?

有人提请我注意这篇文章,声称(我在解释) STL 术语被滥用来指代整个 C++ 标准库,而不是取自 SGI STL 的部分。

(...) 它指的是“STL”,尽管事实上很少有人仍在使用 STL(它是在 SGI 设计的)。

C++ 标准库的一部分是基于 STL 的一部分,许多人(包括几位作者和臭名昭著的错误缠身的 cplusplus.com)仍然将这些部分称为“STL”。但是,这是不准确的;确实,C++标准从来没有提到过“STL”,两者在内容上也有区别。

(...) “STL”很少用于指恰好基于 SGI STL 的 stdlib 位。人们认为它是整个标准库。它被放在简历上。它具有误导性。

我对 C++ 的历史几乎一无所知,所以我无法判断这篇文章的正确性。我应该避免使用术语 STL 吗?或者这是一个孤立的观点?

0 投票
5 回答
161643 浏览

c++ - 如何在 C++ 中将数字转换为字符串,反之亦然

由于这个问题每周都会被问到,所以这个常见问题解答可能会帮助很多用户。

  • 如何在 C++ 中将整数转换为字符串

  • 如何在 C++ 中将字符串转换为整数

  • 如何在 C++ 中将浮点数转换为字符串

  • 如何在 C++ 中将字符串转换为浮点数

0 投票
4 回答
271171 浏览

c++ - C++11 中的 T&&(双 & 符号)是什么意思?

我一直在研究 C++11 的一些新特性,其中一个我注意到的是声明变量时的双 & 符号,比如T&& var.

首先,这个野兽叫什么?我希望谷歌允许我们搜索这样的标点符号。

它到底是什么意思?

乍一看,它似乎是一个双重引用(如 C 风格的双指针T** var),但我很难想到一个用例。

0 投票
6 回答
82028 浏览

c++ - 为什么循环条件内的 iostream::eof(即 `while (!stream.eof())`)被认为是错误的?

我刚刚在这个答案中找到了一条评论,说iostream::eof在循环条件中使用“几乎肯定是错误的”。我通常使用类似的东西while(cin>>n)- 我猜它会隐式检查 EOF。

为什么检查 eof 显式使用while (!cin.eof())错误?

它与scanf("...",...)!=EOF在 C 中使用(我经常毫无问题地使用)有什么不同?

0 投票
5 回答
1885 浏览

c++ - 将 std::string 转换为 C 函数的 char* 时要注意什么?

我已经阅读了许多帖子,询问如何将 C++ 转换std::stringconst std::string&achar*以将其传递给 C 函数的问题,并且似乎有很多关于这样做的警告。必须注意字符串是连续的以及许多其他事情。关键是我从来没有真正理解所有需要注意的点,为什么

我想知道是否有人可以总结从 astd::string到 a的转换char*需要传递给 C 函数的注意事项和缺点?

std::string是一个const引用并且它只是一个非常量引用时,以及 C 函数何时会改变char*以及何时不会改变它。

0 投票
7 回答
55903 浏览

c++ - C++中的多态性

AFAIK:

C++ 提供了三种不同类型的多态性。

  • 虚函数
  • 函数名重载
  • 运算符重载

除了以上三种类型的多态性,还有其他类型的多态性:

  • 运行
  • 编译时
  • 特设多态性
  • 参数多态性

我知道运行时多态可以通过虚函数实现 ,静态多态可以通过模板函数实现

但是对于另外两个

临时多态性:

如果可以使用的实际类型的范围是有限的,并且必须在使用前单独指定组合,这称为临时多态性。

参数多态性:

如果所有代码都是在没有提及任何特定类型的情况下编写的,因此可以透明地与任意数量的新类型一起使用,则称为参数多态。

我几乎无法理解他们:(

如果可能的话,谁能用一个例子来解释它们?我希望这个问题的答案对他们大学的许多新学员有所帮助。

0 投票
2 回答
20090 浏览

c++ - C++11 中的安全布尔成语是否已过时?

@R的这个答案。Martinho Fernandes表明,safe-bool 习惯用法在 C++11 中显然已被弃用,因为它可以被一个简单的替换

根据答案中的标准报价§4 [conv] p3

对于某些发明的临时变量(第 8.5 节) ,T当且仅当声明格式正确时,表达式 e 才能隐式转换为类型。某些语言结构要求将表达式转换为布尔值。对于某些发明的临时变量 t(第 8.5 节),当且仅当声明格式正确时,出现这种上下文中的表达式被称为上下文转换为格式正确。T t=e;teboolbool t(e);

突出显示的部分清楚地将“隐式显式转换”(在标准中称为“上下文转换”)显示为@R。马蒂尼奥说的。

需要“隐式显式转换”的“某些语言结构”似乎如下:

  • if, while, for( §6.4 [stmt.select] p4)
  • 二元逻辑运算符&&and ||(§5.14 [expr.log.and/or] p1对于两者)
  • 逻辑否定运算符!( §5.3.1 [expr.unary.op] p9)
  • 条件运算符?:( §5.14 [expr.cond] p1)
  • static_assert( §7 [dcl.dcl] p4)
  • noexcept( §15.4 [except.spec] p2)

我们在标题中的假设是否正确?我希望我们没有忽略任何潜在的缺点。

0 投票
5 回答
249995 浏览

c++ - 编译/链接过程如何工作?

编译和链接过程如何工作?

(注意:这是对Stack Overflow 的 C++ FAQ 的一个条目。如果您想批评以这种形式提供 FAQ 的想法,那么开始这一切的 meta 上的帖子就是这样做的地方。该问题在C++ 聊天室中进行监控,FAQ 想法最初是从那里开始的,因此您的答案很可能会被提出该想法的人阅读。)