Questions tagged «c++»

C ++是一种通用编程语言。它最初被设计为C的扩展,并且具有类似的语法,但是现在它是一种完全不同的语言。使用此标记可解决有关将要使用C ++编译器编译的代码的问题。对于与特定标准修订版[C ++ 11],[C ++ 14],[C ++ 17]或[C ++ 20]等相关的问题,请使用特定于版本的标记。

16
编写多个“ for”循环的简洁方法
对于具有多个维度的数组,我们通常需要for为其每个维度编写一个循环。例如: vector< vector< vector<int> > > A; for (int k=0; k<A.size(); k++) { for (int i=0; i<A[k].size(); i++) { for (int j=0; j<A[k][i].size(); j++) { do_something_on_A(A[k][i][j]); } } } double B[10][8][5]; for (int k=0; k<10; k++) { for (int i=0; i<8; i++) { for (int j=0; j<5; j++) { do_something_on_B(B[k][i][j]); …
98 c++  for-loop 

4
cout << a ++ << a;的正确答案是什么?
最近在一次采访中,出现了以下客观类型问题。 int a = 0; cout &lt;&lt; a++ &lt;&lt; a; 答案: 一个。10 羽 01 c。未定义的行为 我回答了选项b,即输出为“ 01”。 但是令我惊讶的是,一位面试官告诉我,正确的答案是选项c:未定义。 现在,我知道C ++中序列点的概念。对于以下语句,该行为是未定义的: int i = 0; i += i++ + i++; 但按我的理解的声明cout &lt;&lt; a++ &lt;&lt; a中,ostream.operator&lt;&lt;()将被称为两次,第一次以ostream.operator&lt;&lt;(a++)后来ostream.operator&lt;&lt;(a)。 我还在VS2010编译器上检查了结果,其输出也为'01'。
98 c++  c++-faq 

14
我应该继承std :: exception吗?
我已经看到至少一个可靠的消息源(我采用了C ++类)建议C ++中特定于应用程序的异常类应继承自std::exception。我不清楚这种方法的好处。 在C#中,继承的原因ApplicationException很明确:您可以获得一些有用的方法,属性和构造函数,而只需添加或覆盖所需的内容即可。有了std::exception这一切似乎你得到的是一个what()覆盖方法,你也可以同样创造自己。 那么,将其std::exception用作特定于应用程序的异常类的基类有什么好处(如果有)?有什么好的理由不继承std::exception吗?

4
我们为什么要复制然后移动?
我在某处看到的代码中有人决定复制一个对象,然后将其移动到类的数据成员中。这让我感到困惑,因为我认为移动的全部目的是避免复制。这是示例: struct S { S(std::string str) : data(std::move(str)) {} }; 这是我的问题: 为什么我们不采用右值引用str? 一份副本会不会很贵,特别是给类似的东西std::string吗? 作者决定复制然后搬家的原因是什么? 我什么时候应该自己做?

6
(如何)我可以计算枚举中的项目?
当我有类似的东西时,我想到了这个问题 enum Folders {FA, FB, FC}; 并希望为每个文件夹创建一个容器数组: ContainerClass*m_containers[3]; .... m_containers[FA] = ...; // etc. (使用地图这是更优雅的使用方法:std::map&lt;Folders, ContainerClass*&gt; m_containers;) 但是回到我的原始问题:如果我不想对数组大小进行硬编码怎么办,有没有办法确定文件夹中有多少个项目?(无需依赖于例如FC列表中的最后一项,ContainerClass*m_containers[FC+1]如果我没有记错的话,这将允许类似的操作。)
98 c++  count  enumeration 

7
C ++警告:双零除数
情况1: #include &lt;iostream&gt; int main() { double d = 15.50; std::cout&lt;&lt;(d/0.0)&lt;&lt;std::endl; } 它在编译时没有任何警告和打印inf。好的,C ++可以处理零除(实时查看)。 但, 情况2: #include &lt;iostream&gt; int main() { double d = 15.50; std::cout&lt;&lt;(d/0)&lt;&lt;std::endl; } 编译器发出以下警告(实时查看): warning: division by zero [-Wdiv-by-zero] std::cout&lt;&lt;(d/0)&lt;&lt;std::endl; 为什么在第二种情况下编译器会发出警告? 是0 != 0.0吗 编辑: #include &lt;iostream&gt; int main() { if(0 == 0.0) std::cout&lt;&lt;"Same"&lt;&lt;std::endl; else std::cout&lt;&lt;"Not …

9
如何从int转换为char *?
我知道的唯一方法是: #include &lt;sstream&gt; #include &lt;string.h&gt; using namespace std; int main() { int number=33; stringstream strs; strs &lt;&lt; number; string temp_str = strs.str(); char* char_type = (char*) temp_str.c_str(); } 但是,有没有一种方法可以减少打字?

2
在可变参数模板的上下文中,“…”令牌的规则是什么?
在C ++ 11中,有这样的可变参数模板: template&lt; class T, class... Args &gt; unique_ptr&lt;T&gt; make_unique( Args&amp;&amp;... args ) { return unique_ptr&lt;T&gt;(new T(std::forward&lt;Args&gt;(args)...)); } 对此有一些好奇:表达式同时std::forward&lt;Args&gt;(args)...使用Args且args仅使用一个...标记。此外,还有std::forward一种仅采用一个模板参数和一个自变量的非可变模板函数。(大致)有什么语法规则?如何将其概括? 另外:在函数实现中,省略号(...)位于关注表达式的末尾。是否有原因在模板参数列表和参数列表中省略号位于中间?

7
为什么同一类的对象可以访问彼此的私有数据?
为什么同一类的对象可以访问彼此的私有数据? class TrivialClass { public: TrivialClass(const std::string&amp; data) : mData(data) {}; const std::string&amp; getData(const TrivialClass&amp; rhs) const { return rhs.mData; }; private: std::string mData; }; int main() { TrivialClass a("fish"); TrivialClass b("heads"); std::cout &lt;&lt; "b via a = " &lt;&lt; a.getData(b) &lt;&lt; std::endl; return 0; } 此代码有效。对象a完全有可能从对象b访问私有数据并将其返回。为什么会这样呢?我认为私有数据是私有的。(我首先尝试了解pimpl习惯用法中的副本构造函数,但后来发现我什至不了解这种简单情况。)

6
在构造函数初始值设定项中初始化成员数组
class C { public: C() : arr({1,2,3}) //doesn't compile {} /* C() : arr{1,2,3} //doesn't compile either {} */ private: int arr[3]; }; 我相信原因是只能使用=语法来初始化数组,即: int arr[3] = {1,3,4}; 问题 我该怎么做我想做的事情(就是在构造函数中初始化一个数组(而不是在主体中分配元素))。可能吗? C ++ 03标准是否对在ctor初始化程序中初始化聚合(包括数组)有什么特别的建议?还是上述代码的无效性是其他某些规则的必然结果? C ++ 0x初始化程序列表可以解决问题吗? PS:请不要提及向量,boost :: arrays及其对数组的优越性,我很清楚。



5
为什么在使用[]时C ++映射类型参数需要一个空的构造函数?
另请参见 C ++标准列表和默认可构造类型 这不是什么大问题,只是令人讨厌,因为我不希望在没有特定参数的情况下实例化我的班级。 #include &lt;map&gt; struct MyClass { MyClass(int t); }; int main() { std::map&lt;int, MyClass&gt; myMap; myMap[14] = MyClass(42); } 这给我以下g ++错误: /usr/include/c++/4.3/bits/stl_map.h:419:错误:没有匹配的函数可用于调用“ MyClass()” 如果添加默认的构造函数,编译效果很好;我敢肯定这不是由语法错误引起的。
98 c++  dictionary 

14
如何在C / C ++中编写日志基础(2)
有什么办法可以写log(base 2)函数? C语言有2个内置函数-&gt;&gt; 1。log以e为底。 2。log10 10为基数; 但是我需要以2为底的对数函数。该如何计算。
98 c++  c 

13
C ++ 11的Sequence-zip函数?
使用新的基于范围的for循环,我们可以编写如下代码 for(auto x: Y) {} 哪个IMO是(例如)的巨大改进 for(std::vector&lt;int&gt;::iterator x=Y.begin(); x!=Y.end(); ++x) {} 它可以用来像Pythons zip函数那样循环两个同时循环吗?对于不熟悉Python的人,代码: Y1 = [1,2,3] Y2 = [4,5,6,7] for x1,x2 in zip(Y1,Y2): print x1,x2 作为输出 (1,4) (2,5) (3,6)
98 c++  c++11  sequences 

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.