问题标签 [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.

0 投票
0 回答
247 浏览

c++ - 构造函数中具有同名变量的成员初始值设定项列表

在这个例子中:

我的编译器能够理解,in x(x),innerx是参数,outerx是成员变量,无需编写this->

这种行为是标准行为吗?

0 投票
0 回答
55 浏览

c++ - 是否可以在类函数中初始化对象,而不是在构造函数中

嘿,我想看看是否有办法让我在类函数中初始化成员对象。这意味着我不想使用成员初始化列表。

我不想要:Foo::Foo(): bar(), barBar(){}

但想要:Foo::setup(){bar(); barBar() }

希望你能在这里帮助我。

0 投票
1 回答
503 浏览

c++ - 在默认初始化程序 gcc 与 clang 中使用 lambda

从主干工作正常clang++,但从g++主干失败并显示错误消息(链接):

错误:没有为此 lambda 函数捕获“this”

命名空间范围内的定义point_of_cone对两者都适用。

使用 lambda 捕获稍作修改的定义[this]也适用于全局或本地范围。

哪个编译器是对的?

0 投票
1 回答
82 浏览

c++ - 在 gcc 中使用大括号初始化程序初始化成员 std::array 时出错

考虑以下示例:

当试图用 g++ 4.6.3 编译它时,-std=c++0x我得到了这个错误:

但是,在定义变量时,同样的大括号初始化工作:

是因为这个特定版本的 gcc 没有完全实现 C++11 还是我遗漏了一些东西并且第一个示例不正确?

0 投票
2 回答
795 浏览

c++ - C++ - 混合默认成员初始化器和成员初始化列表 - 坏主意?

这部分是风格问题,部分是正确性问题。提交以下示例(处理包含嵌入标头的数据块的类的精简版):

首先,技术上的正确性......写的是否正确,scratch_并且size_将首先初始化,然后header_,然后data_length_?(constexpr项目是编译时文字常量,不考虑初始化顺序。)初始化程序的声明方式是否也正确,无论是默认成员初始化(int foo = 5)还是成员初始化程序列表,对初始化顺序没有影响,但是相反,重要的是声明成员的顺序?我找到了这个答案,引用了关于初始化顺序的 ISO 规范,我收集到的是这并不重要,scratch_而且size_出现在成员初始化列表中,而不是其他被赋予默认成员初始化器的成员;它只重要,scratch_size_在其他成员面前宣布。大概如果scratch_andsize_是最后声明的,那么header_anddata_length_将(不希望地/不正确地)首先被初始化。

风格问题...混合这两种初始化风格是不是很糟糕?我的方法是成员初始化列表 ( scratch_, size_) 中的项目取决于传递给构造函数的参数,而其余的类成员则派生自其他类成员。显然,如果初始化器依赖于构造函数参数,那么它必须进入成员初始化列表。我是否应该将所有初始化程序都放入成员初始化列表中,并放弃默认成员初始化程序?IMO,这可能会使代码更难遵循。想法?

0 投票
2 回答
1270 浏览

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 有时被认为是“有一个初始化程序”,而其他时候却不是。

0 投票
1 回答
555 浏览

c++ - Mersenne Twister 种子作为成员变量

我想知道如何将 mersenne 随机数生成器保留为成员变量并在同一个类中使用它。

我编写了如下的类,它运行良好,但我不喜欢std::mt19937初始化的类。我想知道是否有办法在构造函数中初始化它Test

0 投票
2 回答
2660 浏览

c++ - 成员初始化列表的顺序

多次简化代码后,我发现问题的原因如下。

警告(clang 8.0.0)

g++-6 编译程序。运行程序会导致分段错误。

类成员的初始化是按照成员初始化列表的顺序(: _b(b), _b2(_b._x))还是类中成员的顺序(如B _b2; const B& _b;)?

0 投票
1 回答
457 浏览

c++ - 修改成员初始化器列表

我有一些代码可以有效地减少到

编译器抱怨没有实例A::A匹配参数列表。有什么方法可以使{ int, std::initializer_list<int>, int }a变平,std::initializer_list<int>还是我必须提供A一个额外的构造函数来处理这种情况?如果我不能修改A类怎么办?

0 投票
3 回答
1479 浏览

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

我同意这样的共识,即通常最好在成员初始化列表而不是构造函数的主体中初始化 C++ 数据成员,但我对这种解释持怀疑态度

构建构造函数的另一种(低效)方法是通过赋值,例如:Fred::Fred() { x_ = whatever; }.在这种情况下,表达式无论如何都会导致创建一个单独的临时对象,并且这个临时对象被传递给 x_ 对象的赋值运算符。然后该临时对象在;. 那是低效的。

这真的正确吗?我原以为编译器会忽略默认构造的临时对象,该对象会立即被正文中的赋值替换。我不知道为什么我会预料到这一点,但在阅读了上述声明后,我想我多年来一直在悄悄地假设它。

成员初始化列表实际上更有效吗?如果是这样,是不是因为这个原因?