关于类模板的构造函数重载

时间:2019-04-26 23:42:23

标签: c++

现在我对C ++真的很陌生,目前我在下面有一段代码:

#include <iostream>

using namespace std;

template<typename T>
class Test1
{
    public:
    Test1():var1(1) {
        cout << "Constructor1" << endl;
    }

    Test1(T a):var1(a) {
        cout << "Constructor2" << endl;
    }

    private:
    int var1;
};

template<typename T>
class Test2
{
    public:
    Test2():var2(x) {
        cout << "Constructor3" << endl;
    };

    private:
    int x;
    Test1<int> var2;
};

int main() 
{
    Test2<int> var3;
    return 0;
}

输出将只是

Constructor2
Constructor3

我想知道为什么将调用构造函数2而不是构造函数1,因为在类Test2中,当创建对象var2时,我没有传递任何参数,不应该调用没有参数的构造函数吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

变量的构造函数由其初始化确定。您的Test2构造函数上有一个初始化列表

 Test2():var2(x) {

所以您必须去那里看看如何初始化Test2 :: var2。在初始化列表中,您要传递整数x(未初始化为任何东西),因此它将调用采用整数的Test1构造函数。

如果您没有在初始化器列表中显式初始化var2(例如,如果您只是在构造函数主体中对其进行赋值),则它将被默认初始化并说“ constructor 1”而不是2