问题标签 [initialization-order]

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 回答
604 浏览

c++ - 在静态初始化时使用免费的“char const*”

自由对象的初始化顺序在 C++ 中是未定义的。但是下面的呢?

这仍然是未定义的行为,还是对使用字符串文字初始化的指针有特殊规定?

除此之外:如果 str 是“char const []”类型怎么办?如果它是一个 std::string?

0 投票
6 回答
56629 浏览

c++ - C++ 静态初始化顺序

当我在 C++ 中使用静态变量时,我经常想要初始化一个变量,然后将另一个变量传递给它的构造函数。换句话说,我想创建相互依赖的静态实例。

在单个 .cpp 或 .h 文件中,这不是问题:实例将按照它们声明的顺序创建。但是,当您想用另一个编译单元中的实例初始化静态实例时,似乎无法指定顺序。结果是,根据天气情况,可能会构建依赖于另一个实例的实例,然后才构建另一个实例。结果是第一个实例初始化不正确。

有谁知道如何确保以正确的顺序创建静态对象?我已经搜索了很长时间的解决方案,尝试了所有解决方案(包括 Schwarz Counter 解决方案),但我开始怀疑是否有一个真正有效的解决方案。

一种可能性是使用静态函数成员的技巧:

确实,这确实有效。遗憾的是,您必须编写 globalObject().MemberFunction(),而不是 globalObject.MemberFunction(),导致客户端代码有些混乱和不雅。

更新:感谢您的反应。遗憾的是,似乎我确实已经回答了我自己的问题。我想我得学会忍受它...

0 投票
5 回答
9321 浏览

c++ - C++: Construction and initialization order guarantees

I have some doubts about construction and initialization order guarantees in C++. For instance, the following code has four classes X, Y, Z and W. The main function instantiates an object of class X, which contains an object of class Y, and derives from class Z, so both constructors will be called. Additionally, the const char* parameter passed to X's constructor will be implicitly converted to an object of class W, so W's constructor must also be called.

What are the guarantees the C++ standard gives on the order of the calls to the copy constructors? Or, equivalently, what this program is allowed to print?

edit: Is this correct?

0 投票
3 回答
2402 浏览

c++ - 如果析构函数有副作用并且对象是从另一个静态对象的析构函数访问的,如何进行静态反初始化?

有一个简单且众所周知的模式可以避免静态初始化失败,如C++ FAQ Lite 的第 10.13 节所述

在这个标准模式中,有一个权衡,要么构造的对象永远不会被破坏(如果析构函数没有重要的副作用,这不是问题),要么不能安全地从另一个静态对象的析构函数访问静态对象(请参阅C++ FAQ Lite 的第 10.14 节)。

所以我的问题是:如果静态对象的析构函数具有最终必须发生的重要副作用并且静态对象必须由另一个静态对象的析构函数访问,您如何避免静态反初始化失败?


(注意:FAQ-lite 提到这个问题在C++ 常见问题的 FAQ 16.17 中得到了回答: M. Cline 和 G. Lomow 的常见问题。我无法访问这本书,这就是我问这个问题的原因。 )

0 投票
4 回答
3251 浏览

c++ - 这个自初始化有效吗?

我有这个问题,我之前想过,但认为这不是微不足道的回答

我的问题是程序的行为是定义的还是未定义的,如果它是有效的。如果已定义,那么x已知的值是否在main

0 投票
1 回答
256 浏览

vb.net - VB.NET中类字段的初始化顺序会受到对其他字段的引用的影响吗?

拿这个示例代码:

的输出New Bar()是:

似乎字段的初始化顺序与它们在源代码中出现的顺序相同,这 (a) 会导致意外结果,并且 (b) 似乎有点令人费解,因为通常不允许从 . NET,但这似乎在上面运行良好。

我希望 VB.NET 足够聪明,可以先初始化引用的字段,然后再初始化那些引用它的字段;即我希望看到这个输出:

有人知道如何让 VB.NET 表现得像这样,而无需简单地交换classdependentindependent内部的声明顺序Bar吗?

0 投票
4 回答
140 浏览

c++ - 初始化顺序问题

给定代码示例:

C类有对ab的引用,所以需要用它来初始化。类 A 包含一个 B 的实例和一个 C 的实例。

我的问题是:我可以用 A 中的 B 实例初始化 A 中的 C 实例吗(假设我确实费心放入构造函数)?其次,我是否需要对 A 中的 B 执行任何显式初始化,还是默认初始化,因为它是类中的类类型?

0 投票
2 回答
1962 浏览

wpf - 控制初始化顺序惨败

考虑以下代码:

Slider 将初始化期间引发其ValueChanged事件,而is still 。counternull

这是我在使用 WPF 时遇到的一个更大问题的示例,UI 事件可以随时触发,并且没有一个地方可以放置我的初始化代码,以保证它在所有WPF 系统拥有的指针已被初始化,但在任何 UI 事件触发之前。

处理这个问题的最优雅的方法是什么?这个特定示例应该使用数据绑定这一事实是无关紧要的。

0 投票
2 回答
1748 浏览

c# - 静态变量的初始化顺序不明确

在我研究在 C# 中构建单例的最佳方法期间,我偶然发现了以下文章,其中简要提到了 C++

“C++ 规范在静态变量的初始化顺序上留下了一些歧义。”

我最终调查了这个问题,发现了 thisthis。基本上重点(据我所知)是 C++ 中静态变量的初始化顺序是未定义的。好吧,我想到目前为止还不错,但是后来我想了解这篇文章稍后所做的以下陈述

“幸运的是,.NET Framework 通过对变量初始化的处理解决了这种歧义。”

所以我找到了他们说的这个页面

类的静态字段变量初始化器对应于一系列赋值,它们按照它们在类声明中出现的文本顺序执行。

并举个例子

“因为静态构造函数何时执行的规则(如第 10.11 节所定义)规定 B 的静态构造函数(以及因此 B 的静态字段初始值设定项)必须在 A 的静态构造函数和字段初始值设定项之前运行。”

但是我感到困惑的是,我的理解是这些示例中静态变量的初始化顺序将基于第一次调用类中的方法或字段的时间,而这又基于代码块的执行顺序(本例从左到右)。IE:完全独立于类声明的位置或顺序。然而,根据我对那篇文章的解释,它说它是这些类的声明顺序的结果,我的测试没有支持?

有人可以为我澄清这一点(以及这篇文章试图提出的观点),或许可以提供一个更好的例子来说明所描述的行为?

0 投票
1 回答
443 浏览

scala - 对象交叉引用和初始化顺序

我有以下代码:

所以一开始,因为每个对象都有更多的东西要初始化,所以我打电话

然后在程序中的某个时刻,当我使用cs对象的参数时,我得到 aNullPointerException因为其中引用的对象之一Seq确实是null(打印到控制台显示)。即对对象的引用init比引用它们的其他对象的调用晚init,往往被设置为null

这是一个有趣的情况。我在这里有一个所谓的任意交叉引用,我不知道如何正确实现初始化而不将其完全引入外部方法(无论如何这都是封装的分解)。尤其是用户可能被赋予创建他们自己的单例扩展SuperClass类的能力。

用尽可能少的样板来做到这一点的最佳方法是什么?