调用主构造函数
Invokation of principal constructor
标准定义了三种构造函数:
— 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)。
你得出了一个错误的结论,即委托构造函数不能是主构造函数。委托构造函数链中的第一个委托构造函数是主构造函数。
相关文章:
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 减少复制构造函数调用
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 在 Google 测试中,我可以从构造函数调用 GetParam() 吗?
- C++ - 从另一个类构造函数调用类构造函数
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- 是否可以从移动构造函数调用默认构造函数?
- 在模板生成器模式中分解重复的构造函数调用
- std::atexit 从全局对象的构造函数调用时的排序
- 对构造函数调用的约束
- 编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
- 用构造函数调用填充向量
- 创建指针时是否没有构造函数调用
- 使用 emplace_back 避免移动构造函数调用的最佳方法?
- C++ 抽象类构造函数调用
- 为什么函数参数将带有参数的构造函数调用
- 为什么比“构造函数”调用更多的“解构器”调用
- 将对象传递给函数并不是导致构造函数调用