Questions tagged «c++»

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

21
为什么地址零用于空指针?
在C(或C ++)中,如果指针的值为零,则它是特殊的:建议释放它们的内存后将指针设置为零,因为这意味着再次释放该指针并不危险;当我调用malloc时,如果无法获取内存,它将返回一个值为零的指针;我if (p != 0)一直在确保传递的指针有效,等等。 但是由于内存寻址从0开始,难道不是0像其他地址一样有效吗?在这种情况下,如何使用0来处理空指针?为什么负数不为null? 编辑: 一堆好答案。我将总结一下我的内心理解后所表达的答案中的内容,并希望如果我误会,社区会纠正我。 像编程中的所有其他内容一样,它是一种抽象。只是一个常数,与地址0无关。C++ 0x通过添加关键字来强调这一点nullptr。 它甚至不是地址抽象,它是C标准所指定的常数,并且编译器可以将其转换为其他数字,只要确保它永远不等于“真实”地址即可,如果0不等于,则等于其他空指针。平台使用的最佳价值。 如果不是早期的抽象,那么系统将使用地址0,而程序员无法使用该地址。 我承认,我的负面建议是有点疯狂的头脑风暴。如果对地址使用带符号的整数会造成一点浪费,这意味着除了空指针(-1或其他值)以外,值空间在构成有效地址的正整数和刚刚浪费的负数之间平均分配。 如果任何数字始终可以用数据类型表示,那么它就是0。(可能也是1。我认为一位整数(如果是无符号的,则为0或1),或者如果签名则只是有符号的位,或者是两位整数将会是[-2,1]。但是您可以将0设为null,将1设为内存中唯一可访问的字节。) 我脑子里仍然有一些未解决的事情。指向特定固定地址的堆栈溢出问题指针告诉我,即使空指针的0为抽象,也不一定需要其他指针值。这导致我发布了另一个堆栈溢出问题,我是否想访问地址零?。
121 c++  c  memory  pointers 

3
C / C ++宏字符串串联
#define STR1 "s" #define STR2 "1" #define STR3 STR1 ## STR2 是否可以串联STR3 ==“ s1”?您可以通过将args传递给另一个Macro函数来实现。但是有直接的方法吗?
121 c++  c  c-preprocessor 

6
连接两个字符串文字
我正在阅读Koenig的Accelerated C ++。他写道:“新想法是,我们可以使用+来连接一个字符串和一个字符串文字-或两个字符串(但不能是两个字符串文字)。 很好,我想这很有道理。现在进行两个单独的练习来说明这一点。 以下定义是否有效? const string hello = "Hello"; const string message = hello + ",world" + "!"; 现在,我尝试执行以上操作,它成功了!所以我很高兴。 然后,我尝试进行下一个练习; const string exclam = "!"; const string message = "Hello" + ",world" + exclam; 这没有用。现在,我知道这与不能连接两个字符串文字的事实有关,但是我不理解为什么我设法使第一个示例生效(不是“,world”和“!”之间的语义差异。 “两个字符串文字?这不应该行得通吗?)但是第二个不是。

4
模板<unsigned int N>是什么意思?
在声明模板时,我习惯于使用这种代码: template &lt;class T&gt; 但是在这个问题上,他们使用了: template &lt;unsigned int N&gt; 我检查它是否可以编译。但是这是什么意思?它是非类型参数吗?如果是这样,我们如何有一个没有任何类型参数的模板?
121 c++  templates 

5
为什么C ++ 11不支持指定的初始化列表作为C99?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 2年前关闭。 改善这个问题 考虑: struct Person { int height; int weight; int age; }; int main() { Person p { .age = 18 }; } 上面的代码在C99中合法,但在C ++ 11中不合法。 什么是 C ++ 11 标准委员会排除支持此类方便功能的理由?
121 c++  c  c++11  initialization  c99 

2
运算符重载:成员函数与非成员函数?
我读到一个声明为成员函数的重载运算符是不对称的,因为它只能有一个参数,而另一个自动传递的参数是this指针。因此,没有标准可以比较它们。另一方面,声明为a的重载运算符friend是对称的,因为我们传递了相同类型的两个参数,因此可以对其进行比较。 我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么首选朋友?(使用非对称版本可获得与对称相同的结果)为什么STL算法仅使用对称版本?


6
错误:使用已删除的功能
我一直在研究一个朋友写的一些C ++代码,遇到以下错误,使用gcc4.6编译时从未见过: error: use of deleted function ‘GameFSM_&lt;std::array&lt;C, 2ul&gt; &gt;::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed: uninitialized non-static const member ‘const h_t FlopPokerGameFSM_&lt;std::array&lt;C, 2ul&gt; &gt;::hdealt::h’ 编辑:这来自使用Boost MSM的部分代码:Boost Webpage Edit2:= delete()源代码中的任何地方都没有使用过。 一般来说,此错误是什么意思?发生此类错误时我应该寻找什么?

10
如何在不循环的情况下将数组的内容复制到C ++中的std :: vector?
我有一个值数组,该值数组是我需要存储以供以后处理的程序的不同部分传递给函数的。由于在处理数据之前我不知道函数会被调用多少次,因此我需要动态存储结构,因此我选择了std::vector。我不想push_back单独对所有值进行标准循环,如果我可以使用类似的内容将其全部复制,那就太好了memcpy。
121 c++  stl  vector  copy 


6
如何在C ++中编写简短的文字?
一个非常基本的问题:如何short用C ++ 编写文字? 我知道以下几点: 2 是一个 int 2U 是一个 unsigned int 2L 是一个 long 2LL 是一个 long long 2.0f 是一个 float 2.0 是一个 double '\2'是一个char。 但是我怎么写short文字呢?我试过了,2S但是给出了编译器警告。
120 c++  literals 

2
什么时候在空实例上调用成员函数会导致未定义的行为?
考虑以下代码: #include &lt;iostream&gt; struct foo { // (a): void bar() { std::cout &lt;&lt; "gman was here" &lt;&lt; std::endl; } // (b): void baz() { x = 5; } int x; }; int main() { foo* f = 0; f-&gt;bar(); // (a) f-&gt;baz(); // (b) } 我们预期(b)会崩溃,因为xnull指针没有对应的成员。实际上,(a)不会崩溃,因为this从未使用过指针。 因为(b)取消引用this指针((*this).x = 5;),并且this为null,所以程序将输入未定义的行为,因为始终将取消引用null视为未定义的行为。 会(a)导致不确定的行为吗?如果两个函数(和x)都是静态的怎么办?

9
C ++中的int和long之间有什么区别?
如果我错了请纠正我, int是4个字节,取值范围是-2,147,483,648至2,147,483,647(2 ^ 31) 长是4个字节,取值范围是-2,147,483,648至2,147,483,647(2 ^ 31) C ++有什么区别?它们可以互换使用吗?
120 c++  variables 


11
为什么不能将float值用作模板参数?
当我尝试float用作模板参数时,编译器会为该代码哭泣,而int效果很好。 是因为我不能float用作模板参数? #include&lt;iostream&gt; using namespace std; template &lt;class T, T defaultValue&gt; class GenericClass { private: T value; public: GenericClass() { value = defaultValue; } T returnVal() { return value; } }; int main() { GenericClass &lt;int, 10&gt; gcInteger; GenericClass &lt; float, 4.6f&gt; gcFlaot; cout &lt;&lt; "\n sum of integer is …

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.