问题标签 [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 回答
418 浏览

c++ - 具有空 mem-initializer-list 和空主体的构造函数

我在哪里可以在标准 (C++14) 中找到一个子句,该子句说明具有空mem-initializer-list和空主体的用户定义默认构造函数为每个基类和每个成员子对象调用默认构造函数. 例如考虑下面的代码:

两者的构造函数Base都由A用户声明的构造函数调用,该构造函数Derived()带有一个空的 mem-initializer-list 和一个空的主体。

0 投票
5 回答
6569 浏览

c++ - 成员初始化器列表和非静态数据成员的默认成员初始化器有什么区别?

我想了解使用一种形式而不是另一种形式(如果有的话)有什么区别。

代码 1(直接在变量上初始化):

代码 2(在构造函数上使用初始化列表初始化):

语义上有什么区别,还是只是句法?

0 投票
1 回答
470 浏览

c++ - 从没有默认构造函数的虚拟基类派生类

我正在为我正在开发的 C++ 应用程序编写一个小的异常类层次结构,并且我无法从std::runtime_error. 这是类似于我到目前为止所写的代码:

该类RuntimeException编译没有问题,但IllegalArgumentException拒绝在 VS2015 上编译,产生错误:no default constructor exists for class "std::runtime_error"对于IllegalArgumentException. 这挑战了我对 C++ 继承层次结构的理解,因为我希望这段代码编译得很好。

我的理解是IllegalArgumentException 应该编译,因为虽然std::runtime_error确实没有默认构造函数,但它的构造函数正在被构造函数调用RuntimeException。但显然这一定是错误的,因为编译器拒绝它。似乎希望我std::runtime_error直接从IllegalArgumentException构造函数调用构造函数(当我这样做时编译器错误消失了),但这似乎是错误的,因为那样我会调用构造函数std::runtime_error两次:一次在构造函数中RuntimeException,然后再次在的构造函数IllegalArgumentException

这样做安全和/或有效吗?如果不是,为什么编译器似乎鼓励它?我可以将自己作为成员变量派生std::exception并实现std::string,但我认为从已经实现了这一点的标准类派生会更容易。这是错误的做法吗?此外,我实际上是从两者中获得boost:exceptionstd::runtime_error为这个问题做出贡献的事实吗?

0 投票
2 回答
3047 浏览

c++ - 构造函数初始化列表中的“this”指针

我想我无法理解为什么这不起作用。我一直以为我可以this在构造函数中使用''指针,但我从来不知道我不能this在初始化列表中使用''。

我很想知道与之相关的细节。

0 投票
2 回答
42 浏览

c++ - 避免在 ctor 初始值设定项列表中的字符串赋值中重复调用函数

在下面的代码示例中,我想使用函数std::string A::str_A返回值(可能返回NULL)或const char*. 但我不喜欢Func()被调用两次的事实。

我想做这样的事情:

但是以这种方式使用临时变量——甚至是引用来延长它们的寿命——似乎是非法的(根据我目前的理解)。

是否有 C++03 语法允许A::str_在初始化列表中进行初始化,只调用Func()一次,并且不使用全局/静态变量?如果有使用临时变量的解决方案,我想学习它的语法。

0 投票
4 回答
2275 浏览

c++ - 如何调用所有基类的复制构造函数以复制 C++ 中菱形继承中的大多数派生类对象?

考虑下面的代码:

程序的输出如下:

因此,对于 line类D d(d1)的复制构造函数D被调用。在继承过程中,我们需要显式调用基类的复制构造函数,否则只会调用基类的默认构造函数。到这里我才明白。

我的问题:

现在我想在D d(d1)执行期间调用所有基类的复制构造函数。为此,如果我在下面尝试 D(const D & obj) : A(obj), B(obj), C(obj) {cout << "8";} 然后我得到这个错误:错误:'class A A::A' is inaccessible within this context

如何解决问题。我想要 的复制构造函数AB以及C何时D调用的复制构造函数。这可能是很小的变化,但我没有得到。

0 投票
2 回答
395 浏览

c++ - 为什么在创建大多数派生类的对象时,大多数基类(虚拟)的默认构造函数没有在私有虚拟继承中被调用?

在创建大多数派生类的对象时,如何在私有虚拟继承中调用大多数基类的默认构造函数。但是当在大多数派生类的构造函数初始化列表中提到时,同样不会被调用。

我的问题:

对于下面提到的代码

我得到以下编译错误:

错误:在此上下文中无法访问“类 AA::A”

为什么 A() 构造函数在这里无法访问?

另一方面,下面提到的代码被成功编译并且 A() 构造函数被调用。

程序的输出是: 1234 意味着 A() 构造函数被调用。

那么,为什么在上述两种情况下调用构造函数 A() 的行为会发生变化?

我知道的:

(1) 当我对 B & C 进行“公共虚拟继承”时,即使在大多数派生类的构造函数初始化程序列表中提到了大多数基类的默认构造函数,也会被调用。表示下面的语句编译。D() : A(), B(), C() {cout << "4";}

(2) 在虚继承中,大多数派生类的构造函数直接调用虚基类的构造函数。

对我来说,这可能是虚拟继承的概念问题。请帮助我理解这一点并为此分享良好的参考资料。

0 投票
3 回答
416 浏览

c++ - 为什么不调用虚拟基非默认构造函数,除非大多数派生基显式调用它们?

我想了解为什么 C++ 标准要求使用 '-D_WITH_BUG_' 编译时,中间的非最派生类不能调用虚拟基非默认构造函数,就像这段代码一样:

因此,当没有 -D_WITH_BUG_ 编译时,代码会打印:

但是当使用 -D_WITH_BUG_ 编译时:

为什么这里必须忽略 B(int a, int b) 对 A(a) 的调用?我理解 C++ 标准要求它,但为什么呢?什么是理性?

如果我只实例化一个 B 对象: B b(4,5) ;这确实得到了正确的 b._a 值 4;但是如果 B 是 C 的子类: C c(4,5,6) C::a 最终为 1,则 IFF c 不会直接调用 A(a) 。因此,如果 B(a,b) 是子类对象,则 B(a,b) 的值与它是最派生对象时不同。这对我来说是非常混乱和错误的。有没有希望让足够多的人同意改变 C++ 标准?

0 投票
1 回答
573 浏览

c++ - 虚拟继承的内部机制

C++ 中的示例代码:

这是钻石问题的典型代码(解决方案)。我知道为什么使用 virtual 关键字。但是我不知道编译器处理这个问题的内部机制。现在我遇到了关于上述机制的两种不同的理论,如下所述。

  1. 当使用 virtual 关键字继承一个类时,编译器会在派生类中添加一个虚拟基指针。我检查了派生类的大小,是的,它包括附加指针的大小。但是我不知道在上面的示例中,当类 A 的成员在类 D 中引用时它指向哪里以及它是如何工作的。

  2. 对于每个构造函数,编译器为程序员提供的每个定义创建两个版本。从这个链接知道, 例如在上面的代码中。编译器会生成 2 个版本的 C 构造函数

    以及两个不同版本的构造函数 B

    因此,当构建 D 时,编译器将生成以下任一代码

    以确保只创建 A 的一个实例,从而避免 A 的重复副本。

请帮助我了解内部机制。

0 投票
0 回答
63 浏览

c++14 - 使用 C++ 构造初始化程序打开/读取文件

我编写了一个简单的 C++ 类程序来读取和/或打印一些 BMP 头信息,如下所示,它工作得很好。但是,我想利用 C++ 构造函数初始化程序可以提供的优势。因此,我想使用 C++ 构造函数初始化程序来打开文件并检索数据,即 mOffBits、mWidth 和 mHeight。这可能吗?

头文件:

程序文件:

主.cpp: