我援引「富」的實例
實際上,您正在創建類Foo的實例。
具體而言,您正在通過new()從堆中分配一塊內存。這塊內存足夠大,可以容納Foo :: container以及任何其他開銷類Foo需要。
(在這個例子中,是沒有的。與其他類,可能有額外的屬性或者一個虛擬指針表。)
自然地,新()調用(也許默認?)Foo :: Foo()構造函數,它依次通過std :: vector構造函數初始化Foo :: container。
變量「容器」的範圍是什麼?
容器是實例FOO的屬性[組分]。它只要存在實例foo就存在。
適用範圍,我們可以說美孚::集裝箱。但是你不能訪問Foo :: constainer而沒有類Foo的實例。 (例如,對象foo。)Foo :: constainer不存在沒有類Foo的實例。
(有類變量的工作有所不同,其中一個值的所有實例共享。但這裏是不是這樣的。)
此作用域是IRRELEVANT到您的公共/保護/私有/朋友成員訪問控制。
例如,在一些美孚:: myPublicMethod()你可以參考美孚::容器。儘管在這種情況下你也可以放棄明確的範圍,只需將其稱爲貨櫃。
提醒你,是私人的,你不能訪問美孚::容器外的類Foo的方法。
這個變量是否存在,直到我刪除實例foo?
是的。
我是否需要將「容器」作爲指向矢量的指針?
不,你可以,但你當然不必。
一般來說,我建議不要將類實例成員作爲指針與構造函數中的new相加,並在析構函數中刪除。這是低效率和麻煩的。 (默認拷貝構造函數可以複製指針值,析構函數可以刪除同一指針值的兩倍)
根據您的需求,您可以考慮:
int main(int argc, char* argv[])
{
Foo foo;
// other method calls to which foo is passed
return 0;
}
富會返回0後超出範圍;,並自動刪除。而且,foo將被分配到堆棧而不是堆中。
您可能會發現用過的副本The Annotated C++ Reference Manual有用。這是舊的,但它具有很高的信噪比。
該死的,你什麼時候睡覺? :) – Alastair 2009-01-01 04:25:56
很好的答案。非常感謝。對內存分配有些懷疑 1 - foo將被分配在堆上,對吧? 2 - 容器變量在哪裏? – 2009-01-01 04:36:58