模板调用中的c ++模板

时间:2013-01-15 21:02:39

标签: c++ templates

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

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

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

Data<Data<Point>> d;

我试图完全理解对象的创建方式。我试图使用编译器进入课堂电话,但无济于事。我知道数据需要初始化数据,所以它自己调用一次,但它真正做到了什么?是否有激活构造函数?

谢谢你, 盖

3 个答案:

答案 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;取代。