问题标签 [member-initialization]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何为具有初始化列表构造函数以外的类成员设置默认值
假设我有这样的事情:
a
这工作正常,通过调用构造函数使用默认值进行初始化A
,然后打印Constructed from parameters
.
然后,假设我想以a
不同的方式初始化,所以我添加了一个构造函数,它接受一个初始化列表并更改我的代码:
一切仍然按我的意愿工作,代码a
通过调用A
的第二个构造函数使用默认值初始化并打印Constructed from an initializer list
。
现在,假设我想保持原样,但通过第一个构造函数A
返回设置的默认值。a
如果A
是可移动的,我可以使用A a = A(1,2);
,但这里不是这种情况,那么我该怎么做呢?使用该构造函数设置默认值是不可能的吗?
编辑:我正在寻找适用于 C++14 的解决方案,但如果在 C++17 或 C++20 中有更好的解决方案,那也是我想知道的。
c++ - 如何将元组的值转发给成员初始化程序?
我需要将元组的值转发给成员初始化程序:
上面的代码显然是无效的。我该如何表达?
Member1
并且Member2
没有默认/复制/移动构造函数。
我知道std::apply
,正如如何将元组扩展为可变参数模板函数的参数中所建议的那样?. 我也知道std::make_from_tuple
。但我不知道如何在成员初始化程序中使用这些。
任何 C++ 标准都可以(最好是 C++17,但 C++20 也可以)。
澄清一下,我的真正目标是创建一个Struct
,将两组可变参数传递给它以完美转发它们以初始化member1
和member2
。我认为将这两个集合“分组”为元组可能是一个好主意,因为这就是这样std::map::emplace
做的。其他方法也可以工作(例如,在两组可变参数之间传递一个特殊对象)。
c++ - 成员初始化查询
当我在做hackerrank c++练习时,我在讨论部分偶然发现了这段代码:
我真的不明白成员初始化部分之后发生了什么,确切地说是这部分:
有人能解释一下这行代码对我有什么作用吗?我从未见过这样使用成员初始化。我习惯看到:
所以请尽可能清楚地解释它。感谢您的时间!
c++ - 使用成员初始化器列表进行初始化时如何修复 [-Wreorder] 和 [-Wuninitialized] 冲突?
在一个看起来像这样的类中:
MyClass.h
MyClass.cpp
main.cpp
编译器的输出:
我无法控制someFunc1
and someFunc2
,我只是以这种方式定义它们以编译代码。
我可以通过删除成员初始化器列表来修复这些警告,并像这样初始化构造函数主体中的数据成员:
或者我可以像这样重新排序类主体中数据成员的声明:
但是在这里我不必要地声明了公共成员的范围两次!
如何修复(而不是摆脱)这些警告并仍然使用成员初始化器列表进行初始化?
如您所见,第一个原始形式中的数据成员是根据它们的用法以正确的顺序定义的,但是编译器本身仍然无法弄清楚。
c++ - 我需要在构造函数成员初始化器列表中间调用一个 void 函数,以便可以正确初始化其他对象
这是我的构造函数。
这是场景类声明。
所以给定一个像这样的 JSON 文件。
然后 parseJSONDataIntoShapeData 将遍历文件中的所有形状并 push_back 指向在文件中创建的形状的指针。一些伪代码看起来像。
在调用 parseJSONdata 之后,Allshapes 向量中会有四个形状。但是,由于构造函数如何与我的原始实现一起工作,因此 m_BVH 使用空向量进行初始化,因为 ParseJSONData 在 m_BVH 初始化后被调用,而我希望它使用其中的形状数据进行初始化。
c++ - C++中构造函数的成员初始化
我想问你为什么下面评论的那两个“学生”构造函数不起作用。
另外我想问...
在这句话中'Student'构造函数的参数中,'studentID'和'name'只是参数并且只是在'Student'构造函数的范围内工作吗?或者'studentID'和'name'是'Student'类和'Person'类的成员变量?
我不知道这句话如何为“Person”构造函数提供参数
c++ - 成员初始值设定项列表中的构造函数参数选择
这个问题可能更多地是关于 CPU/内存,而不是 C++ 语言本身。
我在class B
下面提供了一个。
在 的构造函数中B
,对象a
被初始化为num_
而不是num
。我本可以写这个class B_Alternative
。
哪个更快?我的理解是,答案可能取决于B
存储的位置。如果B
在堆栈上,那么编译器可能会直接num_
从中检索,B
并且没有速度损失。如果B
是 在堆上,则需要制作一个堆栈帧来构造a
,并将 的副本num_
移动到堆栈以运行A
的构造函数。然后num_
将被移回堆中的位置a
。这将导致无论存储在哪里B
,构造函数都比构造函数慢。B_Alternative
B_Alternative
A
下面包括一个示例。这只是一个例子。
c++ - 通过成员初始化列表初始化类的引用变量时出现问题
代码
输出
p
指的是k1
和k1
指的是x
。
K1
将超出范围权限,因此尝试访问它会出错。但a1.p
实际上指的是k1
so它指的是不存在的内存。那么为什么访问a1.p
不给出错误。
c++ - 成员初始化列表是否没有定义值?
说我有:
x
构造函数运行后会读取 UB吗?更具体地说,这是什么类型的初始化,零、直接或默认初始化?
我知道如果我们有:
x
将直接初始化为,42
但我不太确定上面的代码片段,如果事实证明这是默认初始化的,我不想被 UB wolf 咬。
c++ - 直接列表初始化还是在成员初始化列表中直接初始化?
我最近赶上了Member Initializer Lists。Cpp-Learning-Site建议始终更喜欢直接列表初始化而不是直接初始化
。
我注意到这两个都可以在成员初始化列表中使用。
以下哪一项更好,原因是什么?
先感谢您。