草庐IT

Initialization

全部标签

c++ - memset() 在构造函数中初始化对象?

我找到了一段使用memset()初始化对象的C++代码:structMessage{Message(){memset(this,0,sizeof(Message));}unsignedinta,b,c;};既然是POD结构,这段代码应该没问题。使用memset而不是构造函数有什么优势,例如:Message():a(0),b(0),c(0){} 最佳答案 像这样使用memset()没有任何优势。抛开所有明显的缺点和future的痛苦,有一个缺点使其效率低于Message():a(0),b(0),c(0){}这是因为POD通常存储在数组

c++ - 了解常量表达式

我试图理解常量表达式概念(来自c++reference):structS{staticconstintc;};constintd=10*S::c;//notaconstantexpression:S::chasnopreceding//initializer,thisinitializationhappensafterconstconstintS::c=5;//constantinitialization,guaranteedtohappenfirst在我们定义它之前,为什么S::c不是常量表达式。虽然它被声明为静态const数据成员...... 最佳答案

c++ - 选择哪种设计来进行复杂的对象初始化?

假设我有一个封装了一个(或多个)成员的类,它必须以某种方式被初始化,没有它就没有合理的方法来使用这个类(所以我不想让它成为可选的).像这样在其构造函数中运行初始化是否更好:classMyClass{MyClass(){if(!obj.initialize()throw...;}private:MyObjectobj;}或者您会建议以下设计:classMyClass{MyClass(){}boolinitialize(){returnobj.initialize();}private:MyObjectobj;}第一个看起来很有吸引力,因为我可以保证在构造函数运行后满足使用我的类的所有要求

c++ - C++中的数组类成员初始化

我有以下代码片段:#includeusingnamespacestd;classA{int*data;intsize;public:A(ints):size(s){data=newint[size];}A(){data=nullptr;}~A(){if(data)delete[]data;}};classB{Aa[2];public:B(){a[0]=A(10);a[1]=A(11);}};intmain(intargc,char*argv[]){Bb;}在上面的C++代码中,我有classA,它有一个array成员int*data,并且(解除)分配内存由(de)构造函数处理。我创建了

c++ - 默认初始化和值初始化结构的不同性能

我有一个带有数组的简单结构:structA{uint32_tarr[size];};我有两个函数,它们使用默认初始化和值初始化创建它:templatevoidtestDefault(){T*pa=newT;//Defaultuse(*pa);deletepa;}templatevoidtestValue(){T*pa=newT();//Valueuse(*pa);deletepa;}我面临着这些功能的不同性能。有趣的是,性能差异取决于我如何声明结构的默认构造函数。我有三种方法:structA{uint32_tarr[size];//Implicitconstructor};struct

c++ - 空括号在结构声明中意味着什么?

这里是struct的缩减定义,只显示了问题所在。structEntry{//bookkeepingrecordformanagingsolutionsearchstd::array,DIM>filled;//whichholeshavebeenfilledstd::array,MAX>cells;//individualcellentries,0=emptystd::vectoroverlaps;std::vector::iteratorcandidates;Entry()=default;};这实际上是一个错误。我在想默认构造函数会对数组进行零初始化,但它只是用随机垃圾填充它们。我现

c++ - C++ 默认初始化会将数组元素设置为其默认值吗?

考虑以下代码:#includeusingnamespacestd;intmain(){int*p=newint[2];for(inti=0;i我运行了好几次。它总是产生以下输出:00我可以假设C++默认初始化将数组元素设置为其默认值吗?在这种情况下,我可以假设p的元素值始终设置为0吗?我已阅读以下相关问题。但他们并没有具体针对我的情况:HowtoinitialisememorywithnewoperatorinC++?Operatornewinitializesmemorytozero 最佳答案 CanIassumethatC++d

c++ - 各种初始化和构造之间的关系?

我问的是Typet{...};和Typet({...});和Typet={...};是等价的吗?如果一个有效,另一个也应该得到相同的结果?如果没有explicit修饰符,它们是等价的吗? 最佳答案 不,这三种形式都是不同的,并且在不同情况下可能独立地是良构或病构的。Here'sanexample第一种形式编译,但第二种和第三种形式不编译:classType{public:explicitType(int,int){}};intmain(){Typet1{1,2};//OkTypet2({1,2});//errorTypet3={1,

c++ - 本地静态对象和异常

我应该如何处理局部静态对象的构造函数抛出的异常?例如我有以下代码:classA{public:A(){throwruntime_error("Ooops");}};voidfoo(){staticAa=A();cout据我了解,在第二次调用foo方法的情况下,对象a被视为完全构造的对象,并且不调用构造函数。(此外,由于未调用第一个异常抛出,似乎a的析构函数) 最佳答案 如果这是真的,那就是编译器错误。(但是,VTTclaimsthatthiscodeproducestheexpectedresultwithVisualStudio2

c++ - 复制初始化: why move or copy constructor was not called even if copy-elision is turned off?

我的问题不同,因为我可能“知道”复制省略。我正在学习复制初始化。但是,以下代码让我感到困惑,因为我已经使用-fno-elide-contructors-O0选项关闭了复制省略。#includeusingnamespacestd;classtest{public:test(inta_,intb_):a{a_},b{b_}{}test(consttest&other){cout我首先使用命令构建:g++-std=c++11-fno-elide-constructors-O0main.cpp-omain得到如下结果:**showelideconstructors**moveconstruct