问题标签 [ctor-initializer]

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

c++ - 成员初始化器列表中的递增是否会产生未定义的行为?

这会导致未定义的行为吗?具体来说,初始化列表中的递增以及如何对其进行评估。

成员声明和初始化列表之间的顺序差异是有意的,因为这是一个可以准确展示这种差异的示例,因此请暂时忽略它。

0 投票
1 回答
178 浏览

c++ - Is it possible to initialize a member variable in the constructor body, instead of the initializer list?

As you might know,

Is the same as:

Which is inefficient because of the double declaration.
The compiler might optimize this, but in my case the class is not a POD.
I must define the member in the constructor body since it can't be compressed into one single line.

Is there any way of doing this?

0 投票
2 回答
182 浏览

c++ - 获取未初始化对象成员的地址是否定义明确?

考虑以下示例。当bar被构造时,它为它的基类型 ( foo) 构造函数提供了尚未初始化的数据成员my_member.y的地址。my_member

这定义好了吗?获取未初始化对象数据成员的地址是否合法?我发现了这个关于传递对未初始化对象的引用的问题,但它并不完全相同。在这种情况下,我在未初始化的对象上使用成员访问运算符。 .

确实,对象的数据成员的地址不应通过初始化来更改,但这并不一定会使地址得到很好的定义。此外,会员访问运营商的 ccpreference.com 页面有这样的说法:

即使没有必要,也会计算两个运算符的第一个操作数(例如,当第二个操作数命名为静态成员时)。

我理解这意味着在&my_member.y my_member将被评估的情况下,我认为这很好(int x; x;看起来很好),但我也找不到支持它的文档。

0 投票
2 回答
218 浏览

c++ - virtual base classes initiailization

I am working on a test and I have hard time to understand this one:

The returned value is 20 000, but actually I do not not understand the why:

All sub-objects representing virtual base classes are initialized by the constructor of the most derived class. If the constructor of the most derived class does not specify a mem-initializer for a virtual base class V, then V's default construtor is called to initialize the virtual base class subobject.

And I tried different way to create a constructor in the derived class but I got errors from the compiler.

Does anyone provide an explanation and how to create such constructor?

0 投票
1 回答
155 浏览

c++ - C++多级虚继承编译问题

我正在开发一个 C++ 项目,其中我正在使用多级继承。

这是我的示例代码:

有人可以解释一下这段代码有什么问题吗?

错误:没有匹配的函数调用“ ClassA::ClassA()
ClassC(int a,int b,int c) : ClassB(a, b, c) {}

0 投票
4 回答
164 浏览

c++ - 构造函数定义 C++ 语法

这两个构造函数声明有什么区别:

VS

我在继承的情况下看到的第一个。

据我所知,这不是一个重复的问题。如果你发现有人可以关闭这个问题。

0 投票
0 回答
61 浏览

c++ - 使虚拟类使用另一个类的基类

我目前正在尝试构建使用多重继承的类层次结构。我有类A,和B,相关如下:CD

我的问题是D将参数传递给B并且C不需要,我想找到一种更好的方法来做到这一点。

我发现最好的方法是先用D初始化,然后用初始化,然后用初始化(即使参数无关紧要)和 'link'的实例to的实例。BB(a_, b_)BAA(a_)CC(a_)CABA

我的意思是内存布局D看起来像这样:

内存布局

WhereC的基类A将位于B.

我已经尝试了多种方法在 C++ 中执行此操作,但我还没有找到一种可以让我更改C's所在位置的A方法,我也不知道是否可能。

我的问题是这是否可以使用继承或其他工具在 C++ 中实现?


即使有可能,我仍然会遇到一个问题,即必须初始化两者BC使用一个不会做任何事情的“虚拟”参数,这对于 int 来说很好,但对于更“重”的东西来说就不行了。

我想要的是,当从Bor继承时C,您将使用一个空的构造函数来初始化它,并在正常创建它时使用另一个构造函数,如下所示:

唯一的问题是我不确定这有什么我应该注意的副作用,或者即使它有效,我也想不出一种方法来很好地测试它。

我不确定是否可以接受同时提出两个问题,我相信它们一起有意义,但如果不是,我会将其编辑出来并作为不同的问题提出。

编辑1:

关于副本,该答案表明未使用的参数将不会用于初始化两个派生类中的最基类。

我的第二个问题是如何避免向两个派生类提供未使用的参数,因为参数可能非常大并且需要很长时间和内存复制。我提供了一个可能的解决方案,但我不确定这是否真的解决了我的问题以及它会产生什么副作用。

因此,更具体地说,我的第二个问题是这种避免向两个派生类提供参数的实现是好的还是我在构建它时没有考虑到的任何副作用?

0 投票
4 回答
533 浏览

c++ - 为什么我不能将 =default 用于具有成员初始值设定项列表的默认 ctor

考虑以下类:

编辑:因为它在几个答案中被提到 - 我知道课堂成员初始化器,但这不是重点)

我认为第二个 ctor 定义会更优雅,更适合现代 C++ 代码(另请参阅如果必须明确使用默认语义,为什么应该使用=default)。但是,似乎没有常见的编译器接受它。而 cppreference 对此保持沉默。

我的第一个想法是成员初始化器列表以某种方式改变了链接的常见问题解答中解释的“默认语义”,因为它可能会或可能不会默认构造成员。但是对于类内初始化器,我们会遇到同样的问题,只是这里Foo() = default;工作得很好。

那么,为什么不允许呢?

0 投票
0 回答
105 浏览

c++ - 了解如何在多重继承中初始化构造函数

我很难解决这类问题。在几天后我要参加的考试中,他们展示了一个C++具有多重继承的程序:

并显示来自 main 的一些代码:

而不是问“输出会是什么?” 我不需要解决方案,我总是可以运行或调试它,但我需要理解直觉,因为我不会在考试中随身携带调试器。现在我知道了我需要遵循的算法:

5 初始化应按以下顺序进行:

— 首先,并且仅对于如下所述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无环图的深度优先从左到右遍历中出现的顺序进行初始化,其中“从左到右”是派生类基说明符列表中基类名称的出现顺序。

— 然后,直接基类应按照它们出现在 base-specifier-list 中的声明顺序进行初始化(无论 mem-initializers 的顺序如何)。

— 然后,非静态数据成员应按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

— 最后,构造函数的主体被执行。[注意:声明顺序是为了确保基子对象和成员子对象以初始化的相反顺序被销毁。]

但是我真的很难解决它们,这没有任何意义。是否有可能展示直觉,也许是解决这类问题的技巧或技巧?也许是为了显示黑暗的角落?也许以某种方式写下所有的类/结构,以某种方式编写 vbase 类以便于查看输出?

0 投票
2 回答
122 浏览

c++ - 如何在构造函数的成员初始化器列表中调用两个函数?

我可以在初始化列表中调用函数吗?请看这段代码: