2013-05-08 44 views
1
#include <iostream> 
using namespace std; 
class MyClass 
{ 
private: 
    static int x; 
static int calc(int a, int b) 
{ 
    cout << "chekcing !! "; 
    return b * a; 
} 
}; 
int MyClass::x = 1; 
int main() 
{ 
MyClass::calc(1,2); 
MyClass::x += 3; 
return 0 ; 
} 

問題:據我所知靜態成員不是類的一部分,那麼爲什麼我們有檢查訪問說明符?爲什麼檢查訪問規範的靜態數據成員

+2

靜態**成員**不是成員? – Mat 2013-05-08 07:05:42

+1

靜態成員是類的一部分,但不是類的實例的一部分。 – Arun 2013-05-08 07:06:36

+1

當然他們是班級的一部分。它們對於所有實例都是一樣的。 – 2013-05-08 07:06:41

回答

6
  • 每個static成員在該類的所有實例中共享。所以它們不屬於一個特定的類實例,但它們屬於類本身。
  • 訪問規範規則是每不是每個對象

從以上,這是合乎邏輯的是,訪問規範規則適用於static成員。

您的困惑源於這樣一個事實,即如果您使用靜態成員檢查類的大小,則不存在對靜態成員存在的開銷。這種行爲是正確的。靜態成員對類的大小沒有貢獻,但它們仍然是類的一部分,標準明確地這樣說。


參考:
9.4.2靜態數據成員:
§1:

靜態數據成員不是類的子對象的一部分。如果聲明一個靜態數據成員thread_local,則每個線程都有一個該成員的副本。如果沒有聲明靜態數據成員thread_local,則該類的所有對象都共享一個數據成員副本。

+0

非常感謝ALOK! :) – 2013-05-08 08:35:18