Questions tagged «c++-faq»

提供协作式,社区编辑的C ++常见问题解答

9
为什么在多线程C或C ++编程中不认为volatile有用?
正如我最近发布的答案所表明的那样,我似乎对volatile多线程编程上下文中的实用程序(或缺少实用程序)感到困惑。 我的理解是:只要变量可以在访问代码的控制流之外更改,则该变量应声明为volatile。信号处理程序,I / O寄存器以及由另一个线程修改的变量都构成了这种情况。 因此,如果您有一个全局int foo,并且foo被一个线程读取,并由另一个线程自动设置(可能使用适当的机器指令),则读取线程会以这种方式看到这种情况,就像看到一个由信号处理程序或由外部硬件条件修改,因此foo应声明volatile(或在多线程情况下,以内存限制的负载访问,这可能是一个更好的解决方案)。 我怎么在哪里错?

7
使用nullptr有什么优势?
这段代码在概念上对三个指针(安全指针初始化)执行相同的操作: int* p1 = nullptr; int* p2 = NULL; int* p3 = 0; 那么,分配指针nullptr比给它们分配值NULLor有0什么好处?
163 c++  c++11  null  c++-faq  nullptr 

5
main的正确声明是什么?
mainC ++中函数的正确签名是什么?正确的返回类型是什么,从中返回值是什么意思main?允许的参数类型是什么,它们的含义是什么? 这是特定于系统的吗?这些规则是否随着时间而改变?如果我违反了该怎么办?
147 c++  main  c++-faq 

3
哪些iomanip操纵器是“粘性”的?
stringstream由于我错误地认为std::setw()这会影响每次插入的字符串流,直到我显式更改它为止,最近我创建一个问题。但是,插入后始终未设置。 // With timestruct with value of 'Oct 7 9:04 AM' std::stringstream ss; ss.fill('0'); ss.setf(ios::right, ios::adjustfield); ss << setw(2) << timestruct.tm_mday; ss << timestruct.tm_hour; ss << timestruct.tm_min; std::string filingTime = ss.str(); // BAD: '0794' 因此,我有很多问题: 为什么setw()这样呢? 这样还有其他操纵器吗? 是否有之间的行为差异std::ios_base::width()和std::setw()? 最后,是否有在线参考清楚地记录了这种行为?我的供应商文档(MS Visual Studio 2005)似乎没有清楚地表明这一点。
140 c++  c++-faq 



7
C ++中的多态
据我所知: C ++提供了三种不同类型的多态性。 虚拟功能 函数名称重载 运算符重载 除了以上三种类型的多态性之外,还存在其他类型的多态性: 运行 编译时间 临时多态性 参数多态性 我知道,运行时多态性可以通过以下方式实现虚函数 和静态多态性可以通过以下方式实现模板功能 但是对于其他两个 临时多态性 网站说的参数多态性, 临时多态性: 如果可以使用的实际类型范围是有限的,并且必须在使用前单独指定组合,则这称为临时多态性。 参数多态性: 如果编写所有代码时都没有提及任何特定类型,因此可以与任何数量的新类型透明地使用,则称为参数多态。 我很难理解他们:( 任何人都可以通过示例解释它们吗?我希望这些问题的答案对他们所在大学的许多新学员有帮助。

5
重载成员访问运算符->,。*
据我所知大多数运算符重载,与成员访问运营商外->,.*,->*等。 特别是,什么传递给这些运算符,应该返回什么? 操作员功能(例如operator->(...))如何知道所引用的成员?能知道吗 它甚至需要知道吗? 最后,是否需要考虑任何常量注意事项?例如,当重载类似的东西时operator[],通常将需要const版本和非const版本。成员访问运算符是否需要const和非const版本?


4
何时使类型在C ++ 11中不可移动?
令我惊讶的是,它没有出现在我的搜索结果中,考虑到C ++ 11中移动语义的用处,我想有人会问过这个问题: 什么时候需要(或者对我来说是个好主意)使类在C ++ 11中不可移动? (原因等比现有的代码,也就是兼容性问题。)

10
在C ++中正确使用堆栈和堆?
我已经编程了一段时间了,但主要是Java和C#。我从来没有真正需要自己管理内存。我最近开始用C ++进行编程,对于何时将内容存储在堆栈上以及何时将它们存储在堆上,我有些困惑。 我的理解是,经常访问的变量应该存储在堆栈和对象中,很少使用的变量以及大型数据结构都应该存储在堆中。这是正确的还是我不正确的?

3
有哪些C ++智能指针实现?
比较,优点,缺点以及何时使用? 这是从垃圾回收线程中衍生出来的中,我认为这是一个简单的答案,它生成了一些有关某些特定智能指针实现的评论,因此似乎值得开始新文章。 最终的问题是,C ++中智能指针的各种实现方式是什么,它们如何进行比较?只是简单的利弊或异常,否则您可能会认为应该起作用。 我已经发布了一些我已经使用或至少被掩盖并考虑使用的实现作为以下答案,并且我了解它们的差异和相似性可能不是100%准确的,因此可以根据需要随时进行事实检查或纠正。 目的是学习一些新的对象和库,或者更正我的用法以及对已经广泛使用的现有实现的理解,并最终为其他人提供不错的参考。


8
为什么标头中包含C ++内联函数?
注意:这不是关于如何使用内联函数或它们如何工作的问题,更多的是为什么要按原样完成它们。 类成员函数的声明不需要将函数定义为inline,而只是函数的实际实现。例如,在头文件中: struct foo{ void bar(); // no need to define this as inline } 那么,为什么一类的内联函数的实现必须要在头文件?为什么不能将内联函数放在.cpp文件中?如果我尝试将内联定义放入.cpp文件中,则会出现以下错误: error LNK2019: unresolved external symbol "public: void __thiscall foo::bar(void)" (?bar@foo@@QAEXXZ) referenced in function _main 1>C:\Users\Me\Documents\Visual Studio 2012\Projects\inline\Debug\inline.exe : fatal error LNK1120: 1 unresolved externals

4
如何重载std :: swap()
std::swap()在排序甚至分配期间,许多std容器(例如std::list和std::vector)都使用它。 但是std的实现swap()非常笼统,对于自定义类型而言效率很低。 因此,可以通过std::swap()使用自定义类型特定的实现进行重载来获得效率。但是如何实现它,以便将其用于std容器?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.