调用主构造函数

时间:2014-08-17 10:52:03

标签: c++ constructor

标准定义了三种构造函数:

— delegating constructor
— target constructor
— principal constructor

12.6.2 / 6:

  

主构造函数是第一个在中调用的构造函数   构造一个对象(即 一个目标构造函数   对象的构造)

但同一部分说:

  

目标构造函数返回后,委托的主体   构造函数被执行

因为,目标构造函数和委托构造函数不能是主构造函数。那么一个人是什么?我想通过例子来考虑:

#include <iostream>

using std::cout;
using std::endl;

struct A
{
    int a;
    A(int a)
    {
        cout << A::a << endl;
        A::a = a;
    }

    A(int a, int b)
    {
        cout << A::a << endl;
        A::a = a + b;
    }

    A() : A(10,10)
    {
        cout << "A()" <<endl;
    }
};

A a; //Subsequence of constructor's body execution is A(int, int) --> A()

int main()
{
    cout << a.a << endl;
}

demo

示例中的主要内容是什么?

2 个答案:

答案 0 :(得分:4)

在您的示例中,您有

struct A
{
    ...

    A(int a, int b)
    {
        ...
    }

    A() : A(10,10) // A() is a delegating constructor and A(int,int) is the target constructor
    {
        ...
    }
};

A a; 

这意味着A()是委托构造函数,A(int,int)是目标构造函数。

标准说(N3690§12.6.2 - 6)

  

主构造函数是第一个在中调用的构造函数   构造一个对象(也就是说,不是一个目标构造函数   对象的构造)。

这意味着A()既是你的例子中的主要和委托构造函数,也是A(int,int),因为它是由委托构造函数调用的,它是一个目标构造函数,而不能是一个主要的建设者。


TL; DR (由pqnet建议):

principal  -> the one you invoke
delegating -> the one which calls another constructor
target     -> the one that is called by another constructor

作为一个不相关的旁注,我同意Joachim:你是默认初始化一个非静态成员变量,并在初始化之前通过作用域解析来打印它的值。这是未定义的行为。

答案 1 :(得分:1)

考虑以下示例

#include <iostream>

int main() 
{
    struct A
    {
        A() : A( 10 ) {}
        A( int x ) : A( x, 20 ) {}
        A( int x, int y ) : x( x ), y( y ) {}
        int x, y;
    };

    A a;

    std::cout << "a.x = " << a.x << std::endl;
    std::cout << "a.y = " << a.y << std::endl;

    return 0;
}

在此示例中,构造函数A()是委托构造函数。它调用构造函数A(int),而构造函数A(int)又是一个调用构造函数A(int,int)的委托构造函数。

在定义中

A a;

调用的第一个构造函数是A()。它是此定义的主要构造函数,因为它首先被调用。那是&#34;主要构造函数是调用的第一个构造函数 在构建一个对象&#34; &#34;

如果您在main主体中再添加一个定义,例如

A a2( 5 );

然后对于这个定义,主构造函数是A(int)。

您做出了错误的结论,委托构造函数不能是主要构造函数。委托构造函数链中的第一个委托构造函数是主要构造函数。