首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++默认构造函数调用

C++默认构造函数调用
EN

Stack Overflow用户
提问于 2015-10-31 20:37:51
回答 3查看 1.2K关注 0票数 0

在下面的代码中,B类有一个类型为A (varA1)的成员。我想要创建一个B类对象,其中成员varA1打算在A类中使用非默认构造函数A(int v1)。

代码语言:javascript
复制
#include <iostream>
using std::cout; using std::endl; using std::string;

class A {
public:
    A() { cout << "A default constructor" << endl;}
    A(int v1);
private:
    int var1;
};
A::A(int v1) {
    cout << "A int constructor" << endl;
    var1 = v1;
}

class B {
public:
    B() { cout << "B default constructor" << endl;}
    B(int v1);
private:
    int var1;
    A varA1;
};
B::B(int v1) {
    cout << "B int constructor" << endl;
    var1 = v1;
    A varA1(int v1);
}

int main()
{
    A TestA(1);
    B TestB(1);

    return 0;
}

然而,当我运行上面的代码时,我得到了以下输出:

代码语言:javascript
复制
A int constructor
A default constructor
B int constructor

我一定是做错了什么。为了使B类在A类中使用非默认构造函数A(int v1),我需要更改什么?

我使用的是ubuntu 14.04LTS。GNU G++ 4.9和5.1都给出了相同的结果。

提前感谢您的阅读和回答。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-31 20:40:13

使用成员初始化列表

代码语言:javascript
复制
B::B(int v1) : var1(v1), varA1(v1) {
    cout << "B int constructor" << endl;
}

请注意,成员的初始化(构造)顺序与类中声明的顺序相同,因此成员初始化列表中的切换顺序不会更改构造发生的顺序(希望编译器会警告您这一点)。如果您尝试从var1构造var1,那么这个小细节就变得非常重要,而var1是在类定义中的varA1之后声明的。

顺便说一句,这一行(在B::B(int v1)构造函数中)都是这样的:

代码语言:javascript
复制
A varA1(int v1);

向前声明一个名为varA1的函数,该函数接受int参数并返回A对象。这与最烦人的解析是半相似的,尽管这并不是最令人烦恼的解析。

票数 4
EN

Stack Overflow用户

发布于 2015-10-31 20:45:22

您可以在B::B(int)构造函数中使用初始化程序列表:

代码语言:javascript
复制
B::B(int v1) : varA1(v1) {
    cout << "B int constructor" << endl;
    var1 = v1; 
}
票数 1
EN

Stack Overflow用户

发布于 2015-10-31 21:51:53

如果不需要默认的ctor,则可以使用

代码语言:javascript
复制
A(void) = delete;  

但是请注意,您可以临时添加此声明作为诊断度量,以便让编译器通知您它希望使用默认ctor的代码。

通过替换

代码语言:javascript
复制
A() { std::cout << "A default constructor" << std::endl;}

使用

代码语言:javascript
复制
A() = delete;

编译器会抱怨B::B(int v1)正文中使用了删除的函数'A::A()‘。

因此,简单地检查了B的第二个数据属性,即“B::varA1 1”,使用A的默认ctor (现在删除)。

通过显式调用B ctor的初始化程序列表中的"varA1 (0)“,您还可以考虑‘修复’B ctor不使用A的默认ctor。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33456355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档