我知道數據需要初始化數據,所以它自己調用一次,但它真的在那裏做了什麼?有沒有構造函數被激活?
數據並未真正調用它一次。這是因爲內部數據和外部數據是兩個不同的類。通常,如果編譯器看到Data<Data<Point>>
,它首先識別內部部分,即Data<Point>
。然後實例化模板,這意味着它創建一個具有模板描述的屬性的類。認識到Data不是一個類是重要的,但是可以用來創建一大堆類的模板。每個類別與其他類別不同,它們是不同的類型,並且彼此之間沒有真正的關係。所以Data<Point>
只是一個instanitation模板,它的一類,它具有類似,說同樣的性質,
class Foo {
Point dMember;
...
};
我只是把它叫做富。編譯器然後看到Data<Data<Point>>
,這也可能是Data<Foo>
。它實例化模板再次,這次使用Foo(即它從第一個實例獲得的類)作爲參數。它得到另一個類,原則上完全獨立於第一個,除了它具有第一實例的類型的成員:
class Bar {
Foo dMember;
...
};
這就是所有。數據不會自行調用,數據甚至不存在作爲類型。在initalization中被調用的構造函數是Bar的構造函數,它反過來將調用Foo的構造函數。您在Data中定義的構造函數並不是真正的構造函數,因爲位於類模板內的任何東西都是模板本身。所以它是一個構造函數模板,如果你調用Foo和/或Bar的構造函數,編譯器會使用該模板實例化實際的構造函數。數據只是編譯器構建真實類(和成員函數,如果需要的話)的藍圖,它永遠不會出現在那裏去玩或調用或初始化任何東西。