2016-11-16 144 views
1

我在做C++後,隨着時間的推移,我已經在類中聲明瞭一個靜態變量作爲私有,據我所知靜態變量是獨立於對象,並跨對象共享。如果我嘗試使用類名打印類之外的靜態變量我得到編譯錯誤是因爲該變量是私人的?我的確讀過,靜態變量只能通過類名和範圍解析運算符來訪問。在類之外訪問私有靜態變量

#include <iostream> 

using namespace std; 

class Sample{ 

    int val; 
    static int value; 
    public: 


     Sample(int in); 
     Sample(); 
     void setval(int in){ 

      val = in; 
     } 

     void printval()const{ 

      cout << val<<endl; 
     } 

}; 

Sample::Sample(int in){ 

    val = in; 
} 

Sample::Sample(){ 

    val = 0; 
} 

int Sample::value = 34; 
int main() 
{ 

    const Sample obj(1); 
    Sample obj2; 

    obj2.printval(); 

    obj.printval(); 

    cout <<"static value = " << Sample::value; 

    return 0; 
} 

錯誤

main.cpp:37:5: error: 'int Sample::value' is private                                     
int Sample::value = 34;                                            
    ^                                                
main.cpp:49:39: error: within this context                                        
    cout <<"static value = " << Sample::value; 
+2

'是這是因爲變量是私人的'是的,並且錯誤消息告訴你到底是什麼。變量是靜態的事實並不改變它仍然是私有的事實。 – SingerOfTheFall

+1

如果你不希望變量爲'private',爲什麼你將它聲明爲'private'? –

+2

這是私人的手段 - 它不允許在課堂以外使用。 參見:http://stackoverflow.com/questions/860339/difference-between-private-public-and-protected-inheritance – woockashek

回答

2

據我知道靜態變量是獨立的對象和共享跨越對象

這是正確的。但是,跨對象實例共享變量並使變量可訪問是彼此獨立的。有(共享,可訪問)對的四種組合。所有四種可供您:

  • public static變量是共享的,類
  • private static變量是共享的外部訪問,但是類
  • public非靜態變量是不共享的外部訪問,但訪問類的外部
  • private非靜態變量既不共享,也不是類外部接近

請注意,您應對私有靜態value方式可你非靜態val,通過給類用戶的一些公共成員函數,即工作方式與靜態變量的工作之後進行建模:

class Sample { 
... 
public: 
    static int getvalue() { return value; } 
}; 

現在你可以這樣打印:

cout << "static value = " << Sample::getvalue(); 
+0

使用的現有printval()方法來印出靜態變量。 –

+0

@SanthoshPai也可以。非靜態成員函數可以訪問靜態成員變量以及非靜態成員變量。 – dasblinkenlight

1

私有類成員和方法僅由類的成員和方法訪問。無論類成員是否爲靜態,這都是事實。這對類成員的可訪問性沒有影響。

需要注意的是一個公共類方法可以訪問私有類成員,就像任何其他的方法,而這並沒有返回一個指針或私有類成員參考排除公共類方法。這是你的一個選擇。