2009-12-09 51 views
1

我有兩個問題。C++靜態成員函數及其範圍

在C++中,靜態成員函數可以直接訪問在同一個類中定義的公共非靜態數據成員? False

在C++中,非靜態成員函數可以直接訪問在同一個類中定義的私有靜態數據成員? 真

我的筆記說第一個問題爲false,第二個爲真。我只是無法找出原因?你能解釋這是爲什麼嗎?謝謝。

P.S.我正在爲我的決賽學習,我似乎無法弄清楚爲什麼。

+2

+1誠實 - 我希望每個人都對他們的動機非常感興趣,即使這很明顯。 – 2009-12-09 03:34:20

+0

goodl回答了你們所有人的謝謝。我現在知道了。 – user69514 2009-12-09 18:27:47

回答

13

大家一致認同,但是應該非常小心他們的措辭,因爲實際上靜態成員函數做的可以訪問公共非靜態數據成員。就此而言,他們也可以訪問私有的非靜態數據成員。他們只需要一個操作對象來訪問其成員。這可能是一個參數,或者是一個全局的,或者是在靜態成員函數中創建的,或者是通過其中一個獲得的。

下面的代碼是罰款:

class foo { 
public: 
    int a; 
    // static member function "get_a" ... 
    static int get_a(foo *f) { 
     // ... accesses public non-static data member "a" 
     return f->a; 
    } 
}; 

所以我們問自己,什麼是「訪問」和「直達」的區別?

我猜這裏的「直接訪問」的含義必須是「僅使用數據成員的名稱,而不指定對象」。每個人都需要一個對象才能訪問非靜態成員 - 這就是非靜態的意思。非靜態成員函數只是不必提及如果他們不想要對象,因爲this是隱含的。因此他們可以直接訪問非靜態數據成員。

非靜態成員函數可以直接訪問私有靜態數據成員的原因首先是代碼位於類的成員中,因此它可以訪問私有數據成員。其次,爲了訪問靜態數據成員,你永遠不需要一個對象(如果你願意,你可以指定一個對象,但所用的全部是表達式的靜態類型,而不是實際的對象),因此訪問是直接的。

5

這裏有一個提示:回想一下,「非靜態數據成員」是指你的類的特定實例的數據成員。靜態成員函數不會在任何特定實例的上下文中運行。

3

靜態成員函數不能訪問實例變量(非靜態數據),因爲實例變量需要該類的實例進行操作。

請記住,靜態數據成員或函數的定義和分配一次(不是每個實例),因此可以通過非靜態函數來訪問,就像你訪問全局變量等

(內部,靜態函數不會像普通成員函數那樣傳遞this指針,即它們使用不同的調用約定,因此它們不能引用this->foo,這是在成員函數中引用成員foo時真正發生的情況。)

0

除了Greg Hewgill的回答,你c將靜態函數看作具有更窄的範圍 - 即成員函數可以訪問靜態函數和所有實例變量。靜態函數雖然只能訪問靜態成員,這足夠合理。

class MyClass { 

    static int m_iStatic;  
    int m_iInstance; 

    static void StaticFunc() { 
    m_iStatic = 8; //OK 
    m_iInstance = 8; //not OK 
    } 

    void InstanceFunc() { 
    m_iStatic = 8; //OK 
    m_iInstance = 8; //OK 
    } 
} 
0

在C++中,一個靜態成員函數具有 在同一類中定義的公共非靜態 數據成員的直接訪問? False

靜態成員函數不能訪問類的非靜態數據,因爲靜態成員函數沒有綁定到實例。就此而言,靜態函數可以在沒有任何對象的情況下訪問任何對象特定的數據都不能在靜態成員函數中訪問。

在C++中,非靜態成員函數已經在相同的類中定義 到專用靜態 數據成員的直接訪問? True

同樣,由於靜態數據成員不屬於任何特定的對象,因此它可以被類的所有實例訪問。

0

讓事情變得更容易,讓脫光公/私。

要訪問對象的數據成員(屬性),您需要知道「對象」是誰/在哪裏。 靜態成員函數在對象之間共享,因此當您要求他獲取數據成員時需要附加信息。

作爲家庭的圖像對象,孩子是數據成員,boardSchoolBus是靜態函數。 每個孩子都可以登上校車,但是如果你要求校車去接孩子,那麼需要知道哪個家庭是正確的?

2

許多面向對象的學者/ pandits會傾向於默默地說,你錯了。 錯誤,不是因爲答案錯誤,而是思維過程需要重新排序。

假設你是潛艇設計師。你已經設計了尼赫魯級潛艇。你有藍圖,但不是潛艇。在尼赫魯班的藍圖上,你有設計師的名字 - 索尼婭甘地。所以現在人們可以靜靜地提到產生價值「索尼婭甘地」的尼赫魯 - >設計師。

現在,每個潛艇都有一個船長。由於沒有潛艇已經建成,你不能提及任何船長,因此參考尼赫魯 - >船長是不合邏輯的。

然後你建造10艘尼赫魯級潛艇,每艘潛艇分配一名船長。一些潛艇是孟買,德里,拉斐爾雅各布,裏希卡普爾。

你仍然不能提及尼赫魯 - >隊長來獲得十名隊長的任何名字。你可以說德里 - >隊長,孟買 - >隊長或裏希卡普爾 - >隊長,並得到相應的隊長的名字,但不會有任何這樣的有效參考尼赫魯 - >隊長,因爲尼赫魯參考是一個類設計,而不是船。

但是,您可以參考德里 - >設計師或孟買 - >設計師或拉斐爾雅各布 - >設計師將會像尼赫魯 - >設計師那樣產生「索尼婭甘地」。

在那裏,明白了嗎?