定义构造函数的两种不同方式

Two different ways of defining a constructor

本文关键字:方式 两种 构造函数 定义      更新时间:2023-10-16

让我们有两段代码。每段代码都有两个类,这些类非常相似。唯一的区别在于定义类B的构造函数。

第一个程序:

using namespace std;
class A
{
    public:
        A( int x ) : val( x ) { cout << val << endl; }
    private:
        int val;
};
class B
{
    public:
        B( int x ) { instanceA( x ); }
    private:
        A instanceA;
};

int main()
{
    B instanceB( 5 );
}

第二个程序:

using namespace std;
class A
{
    public:
        A( int x ) : val( x ) { cout << val << endl; }
    private:
        int val;
};
class B
{
    public:
        B( int x ) : instanceA( x ) { }
    private:
        A instanceA;
};

int main()
{
    B instanceB( 5 );
}

第一个程序中B类的构造函数定义为:

B( int x ) { instanceA( x ) }

第二个程序中B类的构造函数定义为:

B( int x ) : instanceA( x ) { }

第一个代码不起作用,第二个代码起作用-在这种情况下,用第一种和第二种方式定义构造函数与在全局中定义构造函数有什么区别

EDIT:不需要B( int x ) { instanceA( x ); }而需要B( int x ) { instanceA = A( x ) }

对于第二种情况(成员初始化器列表),instanceA将由A::A(int)直接初始化。

对于第一种情况,instanceA将首先由A::A()(默认构造函数)初始化,稍后将执行构造函数的主体。因为A没有默认的构造函数,所以它失败了。

初始化订单

3) 然后,按以下顺序初始化非静态数据成员类定义中的声明
4) 最后,构造函数的主体被执行

并且instanceA(x);不会执行您期望的操作(即调用A::A(int)来初始化它),它将被解析为instanceA.operator()(x);,并且不会编译,因为它不提供operator()

 instanceA( x );

不是函数