繁体   English   中英

调用C ++默认构造函数

[英]C++ Default Constructor Called

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

#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;
}

但是,当我运行上面的代码时,我得到以下输出:

A int constructor
A default constructor
B int constructor

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

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

在此先感谢您阅读和回答。

使用成员初始化列表

B::B(int v1) : var1(v1), varA1(v1) {
    cout << "B int constructor" << endl;
}

请注意,成员的初始化(构造)顺序与在类中声明的顺序相同,因此在成员初始化列表中切换顺序不会更改构造发生的顺序(希望编译器对此发出警告) 。 如果你试图建立这个小细节就变得很重要varA1var1var1是后宣布varA1在类定义。


顺便说一下,所有这行代码都在B::B(int v1)构造函数内完成:

A varA1(int v1);

正向声明一个名为varA1的函数,该函数varA1一个int参数并返回一个A对象。 这与最烦人的解析有半相似之处,尽管实际上并不是最烦人的解析。

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

B::B(int v1) : varA1(v1) {
    cout << "B int constructor" << endl;
    var1 = v1; 
}

如果您不希望使用默认的ctor,则可以使用

A(void) = delete;  

但是请注意,您可以临时添加此声明作为诊断措施,以使编译器通知您要使用默认ctor的代码。

通过更换

A() { std::cout << "A default constructor" << std::endl;}

A() = delete;

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

因此,简短检查确定B的第二个数据属性(即“ B :: varA1”)使用A的默认ctor(现已删除)。

您还可以考虑通过在B ctor的初始化程序列表中显式调用“ varA1(0)”来“固定” B ctor以不使用A的默认ctor。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM