标准定义了三种构造函数:
— 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;
}
示例中的主要内容是什么?
答案 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)。
您做出了错误的结论,委托构造函数不能是主要构造函数。委托构造函数链中的第一个委托构造函数是主要构造函数。