问题标签 [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.
c++ - 为什么标头中有 C++ 内联函数?
注意这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么它们以它们的方式完成。
类成员函数的声明不需要将函数定义为inline
,它只是函数的实际实现。例如在头文件中:
那么为什么类函数的内联实现必须在头文件中呢?为什么我不能将内联函数放入.cpp
文件?如果我尝试将内联定义放入.cpp
文件中,我会收到如下错误:
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 的“新”实现,但我无法找到有关它的许多细节。以前的引用似乎是死链接。
c++ - “STL”和“C++ 标准库”有什么区别?
有人提请我注意这篇文章,声称(我在解释) STL 术语被滥用来指代整个 C++ 标准库,而不是取自 SGI STL 的部分。
(...) 它指的是“STL”,尽管事实上很少有人仍在使用 STL(它是在 SGI 设计的)。
C++ 标准库的一部分是基于 STL 的一部分,许多人(包括几位作者和臭名昭著的错误缠身的 cplusplus.com)仍然将这些部分称为“STL”。但是,这是不准确的;确实,C++标准从来没有提到过“STL”,两者在内容上也有区别。
(...) “STL”很少用于指恰好基于 SGI STL 的 stdlib 位。人们认为它是整个标准库。它被放在简历上。它具有误导性。
我对 C++ 的历史几乎一无所知,所以我无法判断这篇文章的正确性。我应该避免使用术语 STL 吗?或者这是一个孤立的观点?
c++ - 如何在 C++ 中将数字转换为字符串,反之亦然
由于这个问题每周都会被问到,所以这个常见问题解答可能会帮助很多用户。
如何在 C++ 中将整数转换为字符串
如何在 C++ 中将字符串转换为整数
如何在 C++ 中将浮点数转换为字符串
如何在 C++ 中将字符串转换为浮点数
c++ - C++11 中的 T&&(双 & 符号)是什么意思?
我一直在研究 C++11 的一些新特性,其中一个我注意到的是声明变量时的双 & 符号,比如T&& var
.
首先,这个野兽叫什么?我希望谷歌允许我们搜索这样的标点符号。
它到底是什么意思?
乍一看,它似乎是一个双重引用(如 C 风格的双指针T** var
),但我很难想到一个用例。
c++ - 为什么循环条件内的 iostream::eof(即 `while (!stream.eof())`)被认为是错误的?
我刚刚在这个答案中找到了一条评论,说iostream::eof
在循环条件中使用“几乎肯定是错误的”。我通常使用类似的东西while(cin>>n)
- 我猜它会隐式检查 EOF。
为什么检查 eof 显式使用while (!cin.eof())
错误?
它与scanf("...",...)!=EOF
在 C 中使用(我经常毫无问题地使用)有什么不同?
c++ - 将 std::string 转换为 C 函数的 char* 时要注意什么?
我已经阅读了许多帖子,询问如何将 C++ 转换std::string
为const std::string&
achar*
以将其传递给 C 函数的问题,并且似乎有很多关于这样做的警告。必须注意字符串是连续的以及许多其他事情。关键是我从来没有真正理解所有需要注意的点,为什么?
我想知道是否有人可以总结从 astd::string
到 a的转换char*
需要传递给 C 函数的注意事项和缺点?
当std::string
是一个const
引用并且它只是一个非常量引用时,以及 C 函数何时会改变char*
以及何时不会改变它。
c++ - C++中的多态性
AFAIK:
C++ 提供了三种不同类型的多态性。
- 虚函数
- 函数名重载
- 运算符重载
除了以上三种类型的多态性,还有其他类型的多态性:
- 运行
- 编译时
- 特设多态性
- 参数多态性
我知道运行时多态可以通过虚函数实现 ,静态多态可以通过模板函数实现
但是对于另外两个
- 特设多态性
- 该网站说的参数多态性,
临时多态性:
如果可以使用的实际类型的范围是有限的,并且必须在使用前单独指定组合,这称为临时多态性。
参数多态性:
如果所有代码都是在没有提及任何特定类型的情况下编写的,因此可以透明地与任意数量的新类型一起使用,则称为参数多态。
我几乎无法理解他们:(
如果可能的话,谁能用一个例子来解释它们?我希望这个问题的答案对他们大学的许多新学员有所帮助。
c++ - C++11 中的安全布尔成语是否已过时?
@R的这个答案。Martinho Fernandes表明,safe-bool 习惯用法在 C++11 中显然已被弃用,因为它可以被一个简单的替换
根据答案中的标准报价§4 [conv] p3
:
对于某些发明的临时变量(第 8.5 节) ,
T
当且仅当声明格式正确时,表达式 e 才能隐式转换为类型。某些语言结构要求将表达式转换为布尔值。对于某些发明的临时变量 t(第 8.5 节),当且仅当声明格式正确时,出现在这种上下文中的表达式被称为上下文转换为格式正确。T t=e;
t
e
bool
bool 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
)
我们在标题中的假设是否正确?我希望我们没有忽略任何潜在的缺点。
c++ - 编译/链接过程如何工作?
编译和链接过程如何工作?
(注意:这是对Stack Overflow 的 C++ FAQ 的一个条目。如果您想批评以这种形式提供 FAQ 的想法,那么开始这一切的 meta 上的帖子就是这样做的地方。该问题在C++ 聊天室中进行监控,FAQ 想法最初是从那里开始的,因此您的答案很可能会被提出该想法的人阅读。)