草庐IT

CONSTRUCTOR

全部标签

c++ - 最令人烦恼的解析阻止了类内初始化 std::vector<int>

这个问题在这里已经有了答案:Whycan'tmemberinitializersuseparentheses?(2个答案)关闭4个月前。C++11允许类内初始化:structFoo{std::vectorv{3};//vectorof3emptystrings};如果我们想在类中初始化一个intsvector,我们会得到其他东西:structFoo{std::vectorv{3};//vectorofoneelementwithvalue3};这个问题好像是语言的限制,asdiscussedinpreviousquestions.但是,如果这不是类内初始化,我们将能够使用圆括号而不是大

c++ - `Base *b = new Base;` 与 `Base *b = new Base();` 没有定义我自己的构造函数

如果我不定义自己的构造函数,Base*b=newBase;与Base*b=newBase();之间有什么区别吗? 最佳答案 初始化是标准中要遵循的一种PITA...然而,这两个已经存在的答案在他们遗漏的内容上是不正确的,这使他们确认没有区别。在没有用户定义的构造函数的类中调用newT和newT()之间存在巨大差异。在第一种情况下,对象将被默认初始化,而在第二种情况下,它将被“值初始化*”。如果对象包含任何POD子对象,那么第一个将使POD子对象保持未初始化状态,而第二个会将每个子元素设置为0。structtest{intx;std:

c++ - 为什么C++在创建数组时不允许 `new`调用构造函数

假设您正在堆上创建一个对象数组,如下所示:myClass*objectPtr=newmyClass[10];new仅调用默认构造函数,并且(根据我的阅读)不允许调用任何其他构造函数。为什么new不能调用任何其他构造函数背后是否有任何逻辑?做类似的事情似乎更好myClass*objectPtr=newmyClass[10](12);相对于myClass*objectPtr=newmyClass[10];objectPtr[0]=myClass(12);objectPtr[1]=myClass(12);... 最佳答案 WhydoesC

C++11 将 vector 传递给构造函数

我整天都在阅读有关传递参数的最有效方法的文章,但我感到很困惑。我想传递这样的vector:Foof({1,2,3});我只想用传递的vector初始化我的_member变量。现在的问题是我的构造函数应该如何看://passbyvalueFoo(vectorvec):_member{vec}{}//constreferenceFoo(constvector&vec):_member{vec}{}//rvaluereferenceFoo(vector&&vec):_member{std::move(vec)}{} 最佳答案 最简单的方法

c++ - 构造函数中的 "No matching function call"

这是我在“solver.h”文件中的构造函数声明。Solver(constBoard&board_c,intmax_moves_c);尝试编译时出现以下错误...solver.cpp:Inconstructor'Solver::Solver(constBoard&,int)':solver.cpp:6:55:error:nomatchingfunctionforcallto'Board::Board()'Solver::Solver(constBoard&board_c,intmax_moves_c)然后它列出了董事会build者的候选人。我不确定自己做错了什么,因为我看不出为什么会出

c++ - 为什么不调用复制构造函数?

在这段代码中:#includeusingstd::cout;classFoo{public:Foo():egg(0){}Foo(constFoo&other):egg(1){}integg;};Foobar(){Foobaz;baz.egg=3;returnbaz;}intmain(void){Foospam(bar());cout输出是3,而我预计它是1。这意味着在Foospam(bar())行中没有调用复制构造函数。我猜这是因为bar函数没有返回引用。能否请您解释一下spam初始化时到底发生了什么?如果这是一个愚蠢的问题,我提前道歉。谢谢! 最佳答案

c++ - 为什么 C++ 原始类型不像其他类型那样被初始化?

我知道,在C++中,当您编写时inti;在有效地为变量赋值之前,您不能对变量将持有的值做出任何假设。但是,如果你写inti=int();那么您可以保证i将为0。所以我的问题是,这实际上不是语言行为的不一致吗?我的意思是,如果我定义了一个类MyClass并编写了MyClassmyInstance;我可以放心,类的无参默认构造函数会被调用来初始化myInstance(如果没有则编译器会失败),因为RAII原则就是这样。但是,对于原始类型,资源获取似乎不再是初始化。这是为什么?我不认为更改从C继承的这种行为会破坏任何现有代码(世界上是否有任何代码在假设不能对变量的值做出假设的情况下工作?),

c++ - 调用构造函数而不创建对象

下面的代码到底发生了什么。#includeclassDemo{public:Demo(){coutDemo()只是调用构造函数和析构函数。这个过程中是否正在创建一个对象?因此是否正在分配内存? 最佳答案 您没有显式调用构造函数,而是这段代码创建了一个类型为Demo的临时未命名对象,该对象在;之后立即被销毁。是的,为此临时对象分配内存(自动在堆栈上),并在;之后释放(再次自动)。同时,如预期的那样调用构造函数和析构函数。 关于c++-调用构造函数而不创建对象,我们在StackOverflo

c++ - 在基本构造函数完成之前传递 `this` : UB or just dangerous?

考虑这个最小的例子(我能想到的):structBar;structFoo{Bar*constb;Foo(Bar*b):b(b){}};structBar{Foo*constf;Bar(Foo*f):f(f){}};structBaz:Bar{Baz():Bar(newFoo(this)){}};当将this传递给Foo的构造函数时,Baz的层次结构中没有任何内容被创建,但Foo和Bar对它们接收到的指针做任何有问题的事情。现在的问题是,以这种方式泄露this是危险的还是未定义的行为?问题2:如果Foo::Foo(Bar*)是具有相同语义的Foo::Foo(Bar&)会怎么样?我必须传递

c++ - 从派生类初始化列表调用基类构造函数的顺序

structB{intb1,b2;B(int,int);};structD:B{intd1,d2;//whichistechnicallybetter?D(inti,intj,intk,intl):B(i,j),d1(k),d2(l){}//1stBase//orD(inti,intj,intk,intl):d1(k),d2(l),B(i,j){}//lastBase};以上只是伪代码。实际上,我想知道调用基础构造函数的顺序重要吗?是否有任何情况导致的不良行为(尤其是极端情况)?我的问题是关于更多技术方面的问题,不是编码风格。 最佳答案