标准明确指出静态持续时间变量(命名空间范围和类静态成员)的动态初始化不必在执行main之前发生:“命名空间范围对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在main的第一条语句之前完成是实现定义的。”是3.6.2(3)动态初始化不是[总是?]如何实现的吗?有什么更好/更简单的方法来保证对象在使用前被初始化? 最佳答案 你的问题的答案在你引用的那句话之后的下一句(在ISO/IEC14882-2003的3.6.2中)。Itisimplementation-definedwhetherornotthedynamicini
最近我在使用BorlandC++5.2的遗留环境中遇到编译器错误。我有一个.cpp文件,其中包含来自某些我无法控制的C源代码的header。header包含一个包含const成员的结构定义,编译器提示“类中没有构造函数的常量成员”。经调查,此错误似乎与编译器相关。下面是一些带有各种编译器结果的示例代码:#includetypedefstruct{constfloata;}_floater;intmain(){_floaterf={5.1F};printf("%f\r\n",f.a);return0;}Borland5.2E:\Projects\Scratchpad>bcc32-Pcon
我在以下代码中遇到错误,它在visualstudio中运行良好,但是一旦我将其移至使用gcc编译的Xcode时出现此错误Nomatchingconstructorforinitialisationof'ifstream'我已经考虑添加这是一个引用,而不是本网站上建议的拷贝,但它仍然出现错误。voidgetAndSetTextData::GetBannedList(stringfileName){bannedWordCount=0;ifstreaminFile(fileName);while(inFile>>currentWord){bannedWords.push_back(curre
以下代码片段可使用C/C++编译器完美编译:#includeintmain(){intx={5};//输出为5。x虽然是整型,但这里初始化为复合型。我想了解此处进行了哪些转换以及原因。 最佳答案 C允许它进入:(C99,6.7.8p11)"Theinitializerforascalarshallbeasingleexpression,optionallyenclosedinbraces."C++在C++11、8.5.4p1中也有类似的规定 关于c++-整型变量的奇数C/C++初始化语法
我正在看一本书,它说C中的内置类型的初始化和赋值之间没有区别。或C++,但是像string这样的类型在C++,有区别。为什么?为什么C中的内置类型没有区别?? 最佳答案 因为像int这样的标准类型没有构造函数。这些intx=123;inty;y=123;相同(开始时,y会有一些随机/垃圾值)。在创建一个对象时会调用它的构造函数。所以,例如:std::strings="123";std::stringy;y="123";s将立即创建并初始化,而y将被创建,其值将被初始化(基于std::string的构造函数),稍后,它们将在opera
我知道使用nullptr更“类型化”。它可以区分指针类型和0,在函数重载和模板特化方面表现良好。所以我不确定在每个HANDLE/的旧Win32项目中将NULL替换为nullptr是否安全>HWND/HINSTNACE初始化用法?任何建议都会有所帮助。谢谢 最佳答案 对于解析为指针类型的句柄,您可以使用nullptr而不是NULL。大量句柄类型被typedef定义为指针,因此您应该不会遇到太多问题。这不意味着可以使用NULL或nullptr。一些调用返回INVALID_HANDLE_VALUE,在VS2013中定义为((HANDLE)
我知道这个问题之前有人问过,但我不明白为什么它对我的情况不起作用voidcalc(vectorzodis1,vectorzodis2,vectorzodisAts,intzo1,intzo2,intzoA){inti,u=0;intzod1[zo1]=0;intzod2[zo2]=0;intzodA[zoA]=0;}zod1、zod2、zoA的所有3个都给我错误:variable-sizedobjectmaynotbeinitializedc++但是编译器应该知道zo的含义初始化前原因cout工作并打印出意义那么问题是什么? 最佳答案
我有一个用于在C++中初始化数组的函数。初始化后,main无法访问数组中的数据。不知道为什么。有帮助吗?voidtestArray(int*listPtr){listPtr=newint[2];listPtr[0]=0;listPtr[1]=1;}//endtestArrayvoidmain(){int*list;testArray(list);cout 最佳答案 这是因为指针是按值传递的。函数的参数被复制,函数的第一行用新表达式的结果替换指针的本地拷贝。返回main()的指针的原始拷贝不受此影响。您可以通过引用传递指针来“修复”此
这会打印出0,表示data是零初始化。为什么即使base具有用户声明的构造函数也会发生这种情况?structbase{base(){}intdata;};structderived:base{derived()=default;};intmain(){std::cout如果derived有一个用户声明的构造函数,那么它会打印出一个随机值。为什么零初始化依赖于派生类而不是基类? 最佳答案 规则是专门写来涵盖structS{inti;std::strings;};如果没有任何用户提供的构造函数,即使隐式生成的默认构造函数不是平凡的,S(
这个问题在这里已经有了答案:What'sthebehaviorofanuninitializedvariableusedasitsowninitializer?(3个答案)关闭3年前。考虑一些代码:#includeintmain(){usingstd::cout;inta=3;cout我希望它能打印出来a=3newa=3changeda=5olda=3但实际上我得到的似乎是在第二行说newa=0。我认为它会像类构造函数中的初始化列表一样工作,在那里可以这样写C::C(inta):a(a){}但出于某种原因,这是不同的。首先,完全删除外部代码不会导致编译错误。所以我假设inta=a;是有