问题标签 [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 投票
2 回答
233 浏览

c++ - 成员初始化器列表。参数评估顺序

具有成员初始值设定项列表的代码示例。

如果可能有以下评估顺序,我会不会有内存泄漏?

  1. new int()
  2. Throwable()
  3. t()
  4. i()

标准中的顺序是什么?我们有一些规则。

https://en.cppreference.com/w/cpp/language/initializer_list

3) 然后,按照类定义中的声明顺序初始化非静态数据成员。

所以t会在之前构建i

https://en.cppreference.com/w/cpp/language/eval_order

9) 内置逗号运算符的第一个(左)参数的,每个值计算和副作用在第二个(右)参数的每个值计算和副作用之前排序。

但是由于前面的引用,成员初始化器列表并没有使用所有的逗号规则。它不是逗号运算符(https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_o​​perator)。

10) 在列表初始化中,给定初始化器子句的每个值计算和副作用都排在与任何初始化器子句相关联的每个值计算和副作用之前,该初始化器子句在括号括起来的逗号分隔的初始化器列表中。

https://en.cppreference.com/w/cpp/language/list_initialization

列表初始化在以下情况下执行:

5) 如果使用了括号初始化列表,则在构造函数的成员初始化列表中

我还有一个案例。

您能否提供定义成员初始化器列表中参数评估顺序的规则?

0 投票
3 回答
73 浏览

c# - 这可以通过 Lambda/Block 初始化来简化吗?

一直在 Swift 和 C# 之间来回切换,我不确定我是否忘记了某些事情,或者 C# 是否不容易支持我所追求的。

考虑这个计算初始值的代码Foo

有没有办法做这样的事情,而不需要创建单独的一次性使用函数,而是使用即时执行的 lambda/block/whatever?

在 Swift 中,这很简单。您使用立即执行的闭包(花括号)(左括号和右括号),如下所示:

它清晰、简洁,不会使对象的接口与仅用于初始化字段的函数混淆。

注意:要清楚,我想要计算的属性。我正在尝试初始化一个需要多个语句才能完全完成的成员字段。

0 投票
2 回答
195 浏览

c++ - 为什么我们不能在 C++ 中初始化一个类的成员变量

它给出了错误:

0 投票
1 回答
53 浏览

c++ - C ++:使用另一个类中的参数初始化对象数组

我正在尝试创建一个将另一个类的对象数组作为其成员的类。这个“较低”的类构造函数需要一个参数(没有默认的 c-tor),我不知道该怎么做。

和“上层”类:

这显然会产生错误,但我不确定如何修复它。如果可能的话,我想避免使用向量,所以我在 SO 上找到的一些包含向量的解决方案对我来说并不完美。

请注意,sc_core::sc_module_name是 typedef ofconst char*或类似的东西,遗憾的是现在无法查找它。

谢谢你。

0 投票
0 回答
86 浏览

c++ - 非 pod 结构的打包联合

我想知道,按以下方式组织数据是否可以接受?由于成员初始值设定项,结构不再是 POD 类型,并且编译器会发出有关忽略打包属性的警告。是否可以保证包装好?

0 投票
3 回答
455 浏览

c++ - 在构造函数代码之前禁用默认类成员初始化

在 C++ 中,在成员初始化列表中构造的类的任何成员在执行包含类的构造函数之前默认构造。但是,如果该成员变量无论如何都要在它所在的类的构造函数中构造,这似乎是非常浪费的。

我在下面提供了一个示例来阐明我的意思。在这里,Example该类有一个x类型为 的成员变量LargeIntimidatingClass。使用成员初始化列表(中的第一个构造函数Examplex只构造一次。但是,如果x不能使用成员初始化列表合理构造,它会被构造两次!

是的,我意识到在这个愚蠢的示例中您可以编写Example(string s) : x(f1(s),f2(s)), c(f3(s)) {},但我相信您可以想象将一堆逻辑推入成员初始化列表的情况很麻烦(甚至是不可能的)。

当成员初始化列表中未列出成员变量的默认构造函数时,是否可以禁用它?

0 投票
4 回答
137 浏览

c++ - 成员初始化器列表中的赋值操作

我有以下 Stack 类。

注意复制构造函数中的赋值。-Wall -Wextra代码工作,编译良好,编译器(gcc)即使有标志也不会抱怨。编译器会自动将编译器重写为此吗?

还是有什么其他的魔法?我注意到当我更改定义顺序时,编译器会抱怨非按顺序初始化。所以我认为这是我提到的情况。我在文档中找不到任何内容,ASM 输出也对我没有帮助。

0 投票
2 回答
95 浏览

c++ - 如何初始化共享复杂初始化代码的多个常量成员变量?

介绍

让我们介绍这个简单的例子:

琐事

  • 引入的类有两个成员变量:AB
  • 它们分别取A ^ B + A和的值A ^ B + B
  • 它们都共享共同的复杂初始化代码(假设std::pow是复杂的)。

问题

我想同时制作AB成员const

问题

如何在不重复复杂初始化的情况下做到这一点(避免调用std::pow两次)?

我试过的

  1. 创建struct Init扮演过去版本的角色的 class X
  2. 使X成员成为非成员constInitconst
  3. 使用构造函数委托将构造函数参数重定向到Init.
  4. 将非const成员变量从Initto移动X并生成它们const
    • 请注意,没有std::moveTriviallyCopyable 。int

但是,我的解决方案似乎过于复杂。任何帮助,将不胜感激。

没有目标

  • 制作另一个X将存储公共代码结果的成员变量( std::pow)。
  • 在类之外添加另一个级别的间接X例如为 引入基类X)。

笔记

解决方案可以使用比 C++11 更新的 C++ 版本。

0 投票
1 回答
76 浏览

c++ - 初始化类成员 - 默认值或成员初始化列表?

我对何时以及如何在构造函数中初始化类的成员有点困惑。如果我理解正确,您可以通过在类定义中包含默认值、构造函数成员初始化程序列表或通过构造函数主体中的赋值来完成此操作。我意识到最好在进入构造函数的主体之前进行初始化,但是什么时候应该使用成员初始化器列表,什么时候应该使用默认值?

如果我在这里从根本上误解了某些东西,我深表歉意。

0 投票
1 回答
72 浏览

c++ - 标准的哪一部分决定了就地成员与初始化列表的优先级?

我只是做了一个示例,从我个人的角度来看不应该编译,或者至少给出警告,但是 Visual Studio 2017 没有给出任何警告。示例如下:

从我的角度来看(但我不是语言律师), foo 的两个初始化(就地与初始化列表)是模棱两可的。那么这种情况下的规则是什么?