c++-faq相关内容
问题 C ++中 main 函数的正确签名是什么? 正确的返回类型是什么,从 main 返回值是什么意思? 允许的参数类型是什么,它们的含义是什么? 这是特定于系统的吗? 这些规则是否随时间改变了? 如果我违反了他们会发生什么? 解决方案 必须在全局命名空间中将 main 函数声明为非成员函数.这意味着它不能是类的静态或非静态成员函数,也不能放置在名称空
..
什么是“序列点"? 未定义行为与序列点之间是什么关系? 我经常使用诸如 a [++ i] = i; 之类的有趣而令人费解的表达式,以使自己感觉更好.为什么我应该停止使用它们? 如果您已阅读此书,请确保访问后续问题 未定义的行为和顺序点已重新加载. (注意:这是 Stack Overflow的C ++常见问题解答的条目.如果您要批评以这种形式提供FAQ的想法,然后在开始所有这些操
..
在完美转发中, std :: forward 用于转换命名的右值引用 t1 和 t2 到未命名的右值引用。这样做的目的是什么?如果我们离开 t1 & ;,这将如何影响调用函数 inner ? t2 作为左值? template void外部(T1&& t1,T2& amp; t2) { 内部(std :: forward
..
许多C ++书籍都包含这样的示例代码... std :: cout
..
C ++ 17将按值添加此对象的副本捕获,其中捕获规范为 [* this] 。 这有什么用?与捕获 this 有何不同?不能在C ++ 14中使用 [tmp = * this] 实现吗? 奖金,用于解释为什么 P0018R3 使用 [=,tmp = * this] 代替 [tmp = * this] 在他们的例子中。如果他们使用 [tmp = * this] ,则将消除C ++ 14解
..
源文件和翻译单元之间有什么区别? 解决方案 根据C ++标准: 通过预处理指令#include包含的所有头文件和源文件以及减去所有条件包含预处理指令所跳过的任何源行的源文件称为翻译
..
有了新标准,就有了新的做事方法,许多方法都比旧方法好,但旧方法仍然可以。同样很明显,出于向后兼容的原因,新标准并未正式弃用。因此仍然存在的问题是: 哪些旧的编码方式绝对不如C ++ 11样式,我们现在可以做什么? 在回答此问题时,您可能会跳过诸如“使用自动变量”之类的明显内容。 解决方案 最终类:C ++ 11提供了 final 说明符,以防止类派生 C ++ 11 la
..
C ++ 17标准引入了“模板推导指南”。我认为它们与该版本标准中引入的针对构造函数的新模板自变量推论有关,但是我还没有看到关于它们的含义和用途的简单的,常见问题解答风格的解释。 / p> 什么是C ++ 17中的模板推导指南? 为什么(何时)需要它们? 我如何声明它们? 解决方案 模板推导指南是与模板类相关联的模式,它们告诉编译器如何翻译一组参数(及其类型)。 最
..
我认为这有点主观;我不确定这种意见是否会一致(我已经看到很多返回引用的代码段)。 根据对我刚刚问过的有关初始化引用的问题,返回引用可以是邪恶的原因是,[据我了解],这样做很容易错过删除它,这可能导致内存泄漏。 这让我担心,因为我遵循了示例(除非我在想像),并在几个地方做到了……我误会了吗?是邪恶的吗?如果是这样,到底有多邪恶? 我觉得这是因为我的指针和引用混合在一起,再加上我对C
..
最近在一次采访中出现了以下客观类型问题。 int a = 0; cout
..
我已经开始为编程课学习C ++。我已经下载了此“ Hello World”程序: #include 使用命名空间std; int main() { cout
..
最近我得到了在代码中使用 span 的建议,或者在网站上看到了使用 span -应该是某种容器。但是-我在C ++ 17标准库中找不到类似的东西。 那么这个神秘的 span 是什么,以及为什么(或何时) 解决方案 是什么? A span 是: a的非常轻量级的抽象内存中某个位置的 T 类型的连续值序列。 基本上是结构{T * ptr; std :
..
我经常听到,在编译C和C ++程序时,我应该“始终启用编译器警告”。为什么这是必要的?我怎么做? 有时我还听说我应该“将警告视为错误”。我是不是该?我该怎么办? 解决方案 为什么启用警告? 众所周知,C和C ++编译器在默认情况下会报告一些常见的程序员错误,例如: 初始化变量 忘记让返回来自函数的值 printf 和 scanf 系列与格式字符串不匹配 不使用函数事
..
我听说C ++类成员函数模板不能是虚拟的。这是真的? 如果它们可以是虚拟的,那么使用这种功能的情况的例子是什么? 解决方案 模板都是有关编译器在 compile-time 时生成代码的。虚拟函数都是关于运行时系统的,用于确定在运行时中调用哪个函数。 一旦运行时系统发现需要调用模板化的虚拟函数,编译就完成了,并且编译器无法再生成适当的实例了。因此,您不能具有虚拟成员功能模板。
..
我想了解外部联系和内部联系及其区别。 我也想知道 const 变量默认情况下内部链接,除非另行声明为 extern 。 解决方案 编写实现文件( .cpp , .cxx 等),编译器会生成一个翻译单元。这是实现中的源文件以及您在其中 #include d的所有标头。 内部链接仅指翻译单位范围内的所有内容。 外部链接是指超出特定翻译单元的内容。换句话说,可通过整个程序
..
在这样的声明中 const 是什么意思? const 使我感到困惑。 class foobar { public: 运算子int()const; const char * foo()const; }; 解决方案 添加 const时指向方法的关键字 this 指针实际上将成为指向 const 对象的指针,并且因此,您不能更改任何会员数据。 (除非您使用 mutab
..
explicit 关键字在C ++中是什么意思? 解决方案 允许编译器进行一次隐式转换,以将参数解析为函数。这意味着编译器可以使用可通过单个参数调用的构造函数从一种类型转换为另一种类型,以获得正确的参数类型。 以下是带有可用于隐式转换的构造函数的示例类: class Foo { public: //单参数构造函数,可用作隐式转换 Foo(int foo):m_foo
..
在许多C / C ++宏中,我看到的宏代码包裹在看起来毫无意义的 do while 循环中。以下是示例。 #define FOO(X)do {f(X); g(X); }而(0) #定义FOO(X)如果(1){f(X); g(X); } else 我看不到会做什么正在执行。为什么不就这样写呢? #define FOO(X)f(X); g(X) 解决方案
..
由于一些错误的设计决策(由其他人做出的:)),我经常遇到处于C ++项目中的多个编译/链接器错误的情况,这导致不同头文件中C ++类之间的循环依赖(也可能在同一文件中发生)。但是幸运的是(?)这种情况发生得并不多,以至于我下次再次遇到该问题时仍记得该问题的解决方案。 因此,为了轻松起见回想一下,将来我将发布一个具有代表性的问题及其解决方案。当然,欢迎使用更好的解决方案。 啊 B
..
我刚刚在此答案表示,在循环条件中使用 iostream :: eof “几乎肯定是错误的”。我通常使用 while(cin>> n)之类的东西-我猜它隐式检查EOF。 为什么使用 while(!cin.eof())显式检查eof是错误的? 与在其中使用 scanf(“ ...”,...)!= EOF 有何不同? C(我经常会毫无问题地使用它)? 解决方案 因为 iostream
..