关于c ++模板机制的一个小问题。假设我们有一个名为Point的类。现在假设“Data”是模板类/容器,仅包含T(模板)数据成员。 也就是说,“数据”或多或少看起来像这样:
Template <class T>
class Data {
T dMember;
……..
};
现在假设有人在main.cpp文件中使用此类并执行以下声明:
Data<Data<Point>> d;
我试图完全理解对象的创建方式。我试图使用编译器进入课堂电话,但无济于事。我知道数据需要初始化数据,所以它自己调用一次,但它真正做到了什么?是否有激活构造函数?
谢谢你, 盖
答案 0 :(得分:5)
这就像在以下示例中实例化Data2
:
class Data1 {
Point dMember;
};
class Data2 {
Data1 dMember;
};
Data2 d; // = Data<Data<Point>> d;
基本上是Point
。
答案 1 :(得分:2)
我知道Data需要初始化Data,所以它自己调用一次,但它真正做到了什么?是否有激活构造函数?
数据并没有真正称之为itsef一次。这是因为内部数据和外部数据是两个不同的类。通常,如果编译器看到Data<Data<Point>>
,它首先会识别内部部分,即Data<Point>
。然后实例化模板,这意味着它创建了一个具有模板描述的属性的类。重要的是要意识到Data不是一个类,而是一个可用于创建一大堆类的模板。这些类中的每一类都与其他类不同,它们是不同的类型,彼此之间没有真正的关系。所以Data<Point>
只是模板的一个实例,它是一个具有相同属性的类,比如说,
class Foo {
Point dMember;
...
};
我只称它为Foo。然后,编译器会看到Data<Data<Point>>
,它也可能是Data<Foo>
。它再次实例化模板 ,这次使用Foo(即它从第一次实例化获得的类)作为参数。它获得另一个类,原则上完全独立于第一个类,除了它具有第一个实例化类型的成员:
class Bar {
Foo dMember;
...
};
多数民众赞成。数据不会调用自身,数据甚至不会存在作为类型。在初始化中被调用的构造函数是Bar的构造函数,而这些构造函数又将调用Foo的构造函数。你在Data中定义的构造函数不是真正的构造函数,因为位于类模板中的任何东西都是模板本身。所以它是一个构造函数模板,如果你调用Foo和/或Bar的构造函数,编译器就会使用该模板来实例化实际的构造函数。
数据只是编译器构建真实类(以及成员函数,如果需要)的蓝图,它永远不会出现在那里玩或调用或初始化任何东西。
答案 2 :(得分:1)
数据&lt;的模板点&gt;将是:
class Data<Point> {
Point dMember;
...
};
数据&lt;的模板数据与LT;点&GT;&GT;将是:
class Data<Data<Point>> {
Data<Point> dMember;
...
};
在第二个,数据&lt;点&gt;用作任何其他成员变量。
如果数据&lt; T>有一个构造函数,它将被调用两次。首先是数据&lt;点&gt;因为它是一个成员变量,它们的构造函数首先被调用。然后对于Data&lt;数据与LT;点&GT;取代。