草庐IT

Constructor

全部标签

c++ - 显式默认的移动构造函数

根据c++11标准,只有在以下情况下才会生成默认移动构造函数:X没有用户声明的复制构造函数,并且X没有用户声明的复制赋值运算符,X没有用户声明的移动赋值运算符,X没有用户声明的析构函数,并且移动构造函数不会被隐式定义为已删除。我还能明确默认吗?似乎在clang中正常工作。例如:classMyClass{private:std::vectorints;public:MyClass(MyClassconst&other):ints(other.ints){}MyClass(MyClass&&other)=default;}; 最佳答案

C++构造函数初始化列表抛出异常

我对以下代码有疑问。可见我已经在C的构造函数中处理了A的构造函数抛出的异常,何必再在main函数中捕获并处理异常呢?#includeclassWException:publicstd::exception{public:WException(constchar*info):std::exception(info){}};classA{public:A(inta):a(a){std::cout 最佳答案 您实际上无法捕获构造函数中的异常。你可以处理它,但你必须重新抛出它或另一个异常。原因是关于对象完整性和对象生命周期:如果a的构造抛出

c++ - 我们能否在可能的情况下使用返回值优化,而在可能的情况下退回到移动而不是复制语义?

是否可以编写C++代码,在可能的情况下依赖返回值优化(RVO),但在不行的情况下回退到移动语义?例如,下面的代码由于有条件不能使用RVO,所以它把结果复制回来:#includestructFoo{Foo(){std::cout这产生constructorconstructorcopydestructordestructorfindestructor这是有道理的。现在,我可以通过更改行来强制在上面的代码中调用移动构造函数returnb?x:y;到returnstd::move(b?x:y);这给出了输出constructorconstructormovedestructordestruc

c++ - 稍后在 `: , ` 中使用在构造函数的 `: , ` 部分初始化的成员是否安全?

这个问题在这里已经有了答案:Constructorinitialization-listevaluationorder(3个答案)关闭7年前。例如,在这里调用Area()是否安全:Polygon::Polygon(Coordx0,Coordy0,Coordx1,Coordy1):m_BoundingBox(x0,y0,x1,y1),m_Area(m_BoundingBox.Area()){}也就是说,可以假设构造函数的:,部分中的成员是按照它们列出的顺序构造和初始化的吗?

c++ - 在 ctor 的初始化列表中使用算术是否稳定?

在隐式赋值期间在类的ctor初始化列表中使用这样的东西是否稳定(没有运算符被重载):classC{public:C(int_var):var(_var),i(var*var){}private:intvar;inti;};我得到了一些错误的结果,这是为什么? 最佳答案 是的。你可能想摆脱初始化顺序依赖,然后写:C(int_var):var(_var),i(_var*_var)基本上,通过使i依赖于var,您必须确保var在类中的i之前声明。同样,您可以在C中初始化在父类中定义(和初始化)的内容,因为父类将在C之前构造。最佳实践要求您

c++ - 当用于 "new"初始化时, () 和 {} 是否总是等价的?

有一个帖子处理parenthesesornotafterthetypename使用新的时候。但是这个呢:如果'Test'是一个普通类,有什么区别:Test*test=newTest();//andTest*test=newTest{};此外,假设Test2有一个Value类型参数的构造函数,它是否总是等同于写:Valuev;Test2*test2=newTest(v);//andTest2*test2=newTest{v}; 最佳答案 在涉及std::initializer_list的上下文中可能存在差异,例如:案例1-()和{}#

c++ - 成员初始化列表真的更有效吗?

我同意这样的共识,即通常最好在成员初始化列表而不是构造函数的主体中初始化C++数据成员,但我对thisexplanation持怀疑态度。Theother(inefficient)waytobuildconstructorsisviaassignment,suchas:Fred::Fred(){x_=whatever;}.Inthiscasetheexpressionwhatevercausesaseparate,temporaryobjecttobecreated,andthistemporaryobjectispassedintothex_object’sassignmentoper

c++ - 当我抛出异常时内存是否被释放?

我曾与一些同事讨论当您在动态分配的类中抛出异常时会发生什么。我知道malloc被调用,然后是类的构造函数。构造函数永远不会返回,那么malloc会发生什么?考虑以下示例:classB{public:B(){cout分配的内存o发生了什么,它泄漏了吗?CRT是否捕获构造函数的异常并释放内存?干杯!丰富 最佳答案 调用newB();解决两件事:使用运算符new()进行分配(全局运算符或类特定运算符,可能是语法为new(xxx)B()的放置运算符)调用构造函数。如果构造函数抛出异常,则调用相应的运算符delete。对应的删除是放置删除的情

c++ - 将 boost::bind 与构造函数一起使用

我正在尝试创建新对象并将它们添加到使用boost::bind的对象列表中。例如。structStuff{intsome_member;};structObject{Object(intn);};....lista;listobjs;....transform(a.begin(),a.end(),back_inserter(objs),boost::bind(Object,boost::bind(&Stuff::some_member,_1)));这似乎不起作用。有什么方法可以使用带有boost::bind的构造函数,还是我应该尝试其他方法? 最佳答案

c++ - 有没有办法让 C++ 结构值初始化所有 POD 成员变量?

假设我有一个同时具有POD和非POD成员变量的C++结构:structStruct{std::stringString;intInt;};为了让我的程序产生可重现的行为,我想在构造时初始化所有成员变量。我可以为此使用初始化列表:Struct::Struct():Int(){}问题是一旦我需要更改我的结构并添加一个新的POD成员变量(比如boolBool),我就有忘记将它添加到初始化列表的风险。那么新的成员变量在结构构造时不会被值初始化。我也不能使用memset()技巧:Struct::Struct(){memset(this,0,sizeof(*this));//canbreaknon