2011-02-25 85 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; } 
};