2011-02-25 126 views

回答

10

是的,非靜態成員函數可以只要修改靜態數據成員作爲數據成員的可見性允許它。

1

是的,看到this example一個小樣本程序。

相反的靜態函數不能修改規則的成員變量的方式正式成員函數即可。

+0

可以使用相同的語法的非靜態成員引用靜態成員。您也可以選擇使用class_name :: static_var語法。 – Ferruccio

+0

@Ferruccio - 謝謝,已編輯。 – justkt

+1

緩慢地說,一個靜態成員函數可以在非靜態成員函數的相同規則下修改一個非靜態數據成員,*如果*它可以指定要修改的類的一個實例:'some_instance.some_member = some_value'。只是一個靜態成員函數沒有'this',而且與非靜態成員函數不同,只是命名'some_member'並不意味着'this-> some_member'。所以靜態成員函數需要從某個地方獲得一個實例 - 一個非靜態成員函數有一個方便,並且具有指定它的成員的簡寫方式。 –

0

是的,你可以。

想想,好像他們是表徵類,而「非實例成員」表徵實例屬性「靜態成員」的。

類定義了一個概念,而實例出現了這個概念。 一個愚蠢的例子是類Human是一個概念,而你,安迪是一個實例。你是60億人之中的一個人。

人的觀念說,所有的人有四肢,頭,眼等。這些是實例字段。每個人實例都有自己的四肢,頭,眼...

我可以根據他/她的職業專長的人的觀念。 讓我們考慮一個ComputerEngineer類,很明顯,它定義了計算機工程師。 電腦工程師的任何實例爲人,仍然有四肢,頭,眼...

ComputerEngineer類,但是,可以建模,以便它有一個限定詞(或屬性)最低工資說類別sindicate允許。讓我們把它叫做minimumWage

這是一個情況是相同的屬性必須爲所有的類實例的共同價值。

請注意,儘管此minimumWage不是實例成員,並且每個實例的值不能相同,但它仍與該概念有關,因此它可以被訪問是合理的。

以下假代碼是在具有一個實例方法訪問的靜態成員的意義上有效的:

class Human 
{ 
protected: 
    Limb leftArm; 
    Limb leftLeg; 
    Limb rightArm; 
    Limb rightLeg; 
}; 

class ComputerEngineer : public Human 
{ 
protected: 
    static double _minimumWage; 
    double _wage; 

public: 
    wage(double w) // non-static member function can only be called by instances. 
    { 
    if (w < minimumWage) 
     throw "You're gonna have trouble with the union!"; 
    _wage = w; 
    } 

    minimumWage(double w) 
    { _minimumWage = w; } 
};