问题标签 [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++ - 构造函数中具有同名变量的成员初始值设定项列表
在这个例子中:
我的编译器能够理解,in x(x)
,innerx
是参数,outerx
是成员变量,无需编写this->
。
这种行为是标准行为吗?
c++ - 是否可以在类函数中初始化对象,而不是在构造函数中
嘿,我想看看是否有办法让我在类函数中初始化成员对象。这意味着我不想使用成员初始化列表。
我不想要:Foo::Foo(): bar(), barBar(){}
但想要:Foo::setup(){bar(); barBar() }
希望你能在这里帮助我。
c++ - 在默认初始化程序 gcc 与 clang 中使用 lambda
从主干工作正常clang++
,但从g++
主干失败并显示错误消息(链接):
错误:没有为此 lambda 函数捕获“this”
命名空间范围内的定义point_of_cone
对两者都适用。
使用 lambda 捕获稍作修改的定义[this]
也适用于全局或本地范围。
哪个编译器是对的?
c++ - 在 gcc 中使用大括号初始化程序初始化成员 std::array 时出错
考虑以下示例:
当试图用 g++ 4.6.3 编译它时,-std=c++0x
我得到了这个错误:
但是,在定义变量时,同样的大括号初始化工作:
是因为这个特定版本的 gcc 没有完全实现 C++11 还是我遗漏了一些东西并且第一个示例不正确?
c++ - C++ - 混合默认成员初始化器和成员初始化列表 - 坏主意?
这部分是风格问题,部分是正确性问题。提交以下示例(处理包含嵌入标头的数据块的类的精简版):
首先,技术上的正确性......写的是否正确,scratch_
并且size_
将首先初始化,然后header_
,然后data_length_
?(constexpr
项目是编译时文字常量,不考虑初始化顺序。)初始化程序的声明方式是否也正确,无论是默认成员初始化(int foo = 5
)还是成员初始化程序列表,对初始化顺序没有影响,但是相反,重要的是声明成员的顺序?我找到了这个答案,引用了关于初始化顺序的 ISO 规范,我收集到的是这并不重要,scratch_
而且size_
出现在成员初始化列表中,而不是其他被赋予默认成员初始化器的成员;它只重要,scratch_
并size_
在其他成员面前宣布。大概如果scratch_
andsize_
是最后声明的,那么header_
anddata_length_
将(不希望地/不正确地)首先被初始化。
风格问题...混合这两种初始化风格是不是很糟糕?我的方法是成员初始化列表 ( scratch_
, size_
) 中的项目取决于传递给构造函数的参数,而其余的类成员则派生自其他类成员。显然,如果初始化器依赖于构造函数参数,那么它必须进入成员初始化列表。我是否应该将所有初始化程序都放入成员初始化列表中,并放弃默认成员初始化程序?IMO,这可能会使代码更难遵循。想法?
c++ - C++14 中的聚合成员初始化
有这个结构:
并声明:
根据 Clang (3.8.0) 和 GCC (5.4.0),这些是 8 种可能组合的值(a.b1.e 和 a.b2.a 是重复的情况),关于取初始值的位置从(或不是),:
考虑到N3605和 C++14 标准 (ISO/IEC 14882:2014) 第 8.5.1 节第 7 段中的示例:
如果列表中的初始化子句少于聚合中的成员,则每个未显式初始化的成员都应从其大括号或相等初始化器初始化,或者,如果没有大括号或相等初始化器,从一个空的初始化列表(8.5.4)。
我认为案例 010 是正确的。那么,为什么情况011(a.b2.c)和001(a.b2.e)也不等于0呢?情况 010 为零,因为 a.b2 “确实有一个初始化程序”,因此“忽略了非静态数据成员初始化程序”(再次N3605)。为什么默认成员初始化器也不会被忽略?
事实上,阅读 C++14 标准引用对我来说更有意义的是,案例 010 将是 12(它为零),而案例 011 和 001 将是零(实际上是)。所以我不明白为什么 a.b2 有时被认为是“有一个初始化程序”,而其他时候却不是。
c++ - Mersenne Twister 种子作为成员变量
我想知道如何将 mersenne 随机数生成器保留为成员变量并在同一个类中使用它。
我编写了如下的类,它运行良好,但我不喜欢std::mt19937
初始化的类。我想知道是否有办法在构造函数中初始化它Test
?
c++ - 成员初始化列表的顺序
多次简化代码后,我发现问题的原因如下。
警告(clang 8.0.0)
g++-6 编译程序。运行程序会导致分段错误。
类成员的初始化是按照成员初始化列表的顺序(: _b(b), _b2(_b._x)
)还是类中成员的顺序(如B _b2; const B& _b;
)?
c++ - 修改成员初始化器列表
我有一些代码可以有效地减少到
编译器抱怨没有实例A::A
匹配参数列表。有什么方法可以使{ int, std::initializer_list<int>, int }
a变平,std::initializer_list<int>
还是我必须提供A
一个额外的构造函数来处理这种情况?如果我不能修改A
类怎么办?
c++ - 成员初始化列表真的更有效吗?
我同意这样的共识,即通常最好在成员初始化列表而不是构造函数的主体中初始化 C++ 数据成员,但我对这种解释持怀疑态度
构建构造函数的另一种(低效)方法是通过赋值,例如:
Fred::Fred() { x_ = whatever; }.
在这种情况下,表达式无论如何都会导致创建一个单独的临时对象,并且这个临时对象被传递给 x_ 对象的赋值运算符。然后该临时对象在;
. 那是低效的。
这真的正确吗?我原以为编译器会忽略默认构造的临时对象,该对象会立即被正文中的赋值替换。我不知道为什么我会预料到这一点,但在阅读了上述声明后,我想我多年来一直在悄悄地假设它。
成员初始化列表实际上更有效吗?如果是这样,是不是因为这个原因?