2

关于 c++ 模板机制的一个小问题。假设我们有一个名为 Point 的类。现在假设“数据”是一个模板类/容器,只包含 T(模板)数据成员。也就是说,“数据”看起来或多或少是这样的:

Template <class T>
class Data {
T dMember;
……..
};

现在假设有人在 main.cpp 文件中使用此类并执行以下声明:

Data<Data<Point>> d;

我试图完全了解创建的对象的外观。我试图使用编译器进入课堂通话,但无济于事。我知道 Data 需要初始化 Data 所以它会调用自己一次,但它在那里真正做了什么?是否有构造函数被激活?

谢谢你,盖伊

4

3 回答 3

5

这就像Data2在以下示例中实例化:

class Data1 {
    Point dMember;
};

class Data2 {
    Data1 dMember;
};

Data2 d; // = Data<Data<Point>> d;

基本上,一个包装的包装Point

于 2013-01-15T21:05:14.037 回答
2

我知道 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 的构造函数,编译器会使用该模板来实例化实际的构造函数。

数据只是编译器构建真实类(和成员函数,如果需要)的蓝图,它永远不会在那里播放或调用或初始化任何东西。

于 2013-01-16T07:38:07.883 回答
1

Data< Point > 的模板为:

class Data<Point> {
  Point dMember;
  ...
};

Data< Data< Point>> 的模板为:

class Data<Data<Point>> {
  Data<Point> dMember;
  ...
};

在第二个中,Data< Point > 用作任何其他成员变量。

如果 Data<T> 有构造函数,它将被调用两次。首先是 Data< Point > 因为它是一个成员变量,并且首先调用它们的构造函数。然后为数据<数据<点>>。

于 2013-01-15T22:49:21.780 回答