我知道 Data 需要初始化 Data 所以它会调用自己一次,但它在那里真正做了什么?是否有构造函数被激活?
数据并没有真正调用它一次。这是因为内部数据和外部数据是两个不同的类。一般来说,如果编译器看到Data<Data<Point>>
,它首先识别内部部分,即Data<Point>
。然后它实例化模板,这意味着它创建了一个具有模板描述的属性的类。重要的是要意识到 Data 不是一个类,而是一个可用于创建一大堆类的模板。这些类中的每一个都与其他类不同,它们是不同的类型,彼此之间没有真正的关系。模板的一个实例也是如此Data<Point>
,它是一个具有相同属性的类,例如,
class Foo {
Point dMember;
...
};
我就叫它Foo。编译器然后看到Data<Data<Point>>
,这也可能是Data<Foo>
。它再次实例化模板,这次使用 Foo(即它从第一次实例化得到的类)作为参数。它得到另一个类,原则上完全独立于第一个类,除了它具有第一个实例化类型的成员:
class Bar {
Foo dMember;
...
};
就这样。数据不调用自己,数据甚至不作为一种类型存在。初始化中调用的构造函数是 Bar 的构造函数,而 Bar 的构造函数又会调用 Foo 的构造函数。您在 Data 中定义的构造函数并不是真正的构造函数,因为位于类模板中的任何东西都是模板本身。所以它是一个构造函数模板,如果你调用 Foo 和/或 Bar 的构造函数,编译器会使用该模板来实例化实际的构造函数。
数据只是编译器构建真实类(和成员函数,如果需要)的蓝图,它永远不会在那里播放或调用或初始化任何东西。