调用主构造函数

Invokation of principal constructor

本文关键字:构造函数 调用      更新时间:2023-10-16

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

— delegating constructor
— target constructor
— principal constructor

12.6.2/6:

类中调用的第一个构造函数是主构造函数对象的构造(即而不是)的目标构造函数对象的建筑)

但是同样的部分说:

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

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

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

演示

这个例子中的主体是什么?

在你的例子中,你有

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;博士(建议由pqnet):

principal  -> the one you invoke
delegating -> the one which calls another constructor
target     -> the one that is called by another constructor
作为一个无关的旁注,我同意Joachim的观点:您默认初始化非静态成员变量,并在初始化之前通过作用域解析打印其值。

考虑以下示例

#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又是一个委托构造函数,该委托构造函数调用构造函数A(int, int)。

在定义

A a;

调用的第一个构造函数是A()。它是这个定义的主构造函数,因为它首先被调用。也就是说,主构造函数是第一个被调用的构造函数对象""

的构造中

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

A a2( 5 );

则此定义的主构造函数为A(int)。

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