2009-01-01 105 views
2

我剛剛開始使用C++,並且在理解類中私有成員變量的作用域如何工作時遇到了一些問題。請看下面的代碼私有成員變量範圍 - C++

class Foo{ 
    private: 
     std::vector<int> container; 
    public: 
     // other methods 
}; 

int main(int argc, char* argv[]) 
{ 
    Foo* foo = new Foo; 
    // other method calls to which foo is passed 
    delete foo; 
    return 0; 
} 

在上面的代碼中,變量「container」是一個私有成員變量。我調用「Foo」實例並將它傳遞給其他幾個方法和類。以下是我的疑問

  1. 變量「容器」的範圍是什麼?這個變量是否存在,直到我刪除實例foo?
  2. 我是否需要將「容器」作爲指向矢量的指針?只要

感謝您的幫助

回答

6
  1. 是,容器構件的壽命將持續爲包含它存在的對象,這是直到你的指針指向它調用delete (您的情況爲foo)。
  2. 不,沒有理由這樣做。使它成爲一個指針需要你創建一個動態對象vector<int>,你需要管理它的生命週期(包括調用容器指針的delete)。這裏沒有必要。假設你希望容器的最後時間與Foo對象一樣長,你可以直接包含它,而不需要使用指針。

傳遞foo指針只會傳遞指針。它指向的對象將而不是被複制,只有指向它的指針纔會被需要。如果你知道Java的,那麼它可以幫助你,如果我告訴你傳遞的指針是一樣的只是路過參考Java中的對象,說:

Foo f = new Foo(); 
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied 
doIt(f); 
+0

該死的,你什麼時候睡覺? :) – Alastair 2009-01-01 04:25:56

+0

很好的答案。非常感謝。對內存分配有些懷疑 1 - foo將被分配在堆上,對吧? 2 - 容器變量在哪裏? – 2009-01-01 04:36:58

0

我援引「富」的實例

實際上,您正在創建類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有用。這是舊的,但它具有很高的信噪比。