非静态与静态函数和变量

时间:2010-02-18 02:35:17

标签: c++

我有一个关于静态和非静态函数和变量的问题。

1)非静态函数访问静态变量。

没关系!

class Bar
{
public:

     static int i;

     void nonStaticFunction() {

         Bar::i = 10;

     }

};

int Bar::i=0;

2)非静态函数访问非静态变量

绝对可以!

3)静态函数访问静态变量& funciton

绝对可以!

4)静态函数访问非静态函数

没关系

class Bar
{
public:
     static void staticFunction( const Bar & bar)
     {
         bar.memberFunction();

     }

     void memberFunction() const
     {

     }

}

5)静态函数访问非静态变量

没关系还是不行?我很困惑!

这个例子怎么样

class Bar
{
public:
     static void staticFunction( Bar & bar)
     {
         bar.memberFunction();

     }

     void memberFunction()
     {

         i = 0;
     }

     int i;

};

4 个答案:

答案 0 :(得分:13)

  

静态函数访问非静态   变量

     

没关系还是不行?我很困惑   这!

调用时,静态函数不绑定到类的实例。类实例(对象)将成为包含“非静态”变量的实体。因此,从静态函数中,如果没有实际传递或存储在其他地方操作的特定实例,您将无法访问它们。

所以是的,你上一个例子中的代码是有效的,因为你是在实例中传递的。但是,你做不到:

static void staticFunction()
{
    // error, this function is static, and is therefore
    // not bound to a specific instance when called
    i = 5;


}

答案 1 :(得分:7)

静态意味着它独立于类的特定实例。静态方法无权访问this指针。这就是您需要使用类名称调用它们的原因。

当您调用Static方法时,您甚至可能没有定义任何类的实例。

非静态意味着一个实例,并且可能因不同实例而不同。

因此,基本上,从静态方法访问非静态成员是没有意义的。

答案 2 :(得分:1)

不行。无需具有类的实例即可访问静态函数,因此无法访问您需要实例确定的信息。

例如,您不需要汽车知道它有多少车轮,一般汽车的蓝图就足够了(这可能是静态信息)但除非您是汽车,否则您无法分辨汽车的颜色指特定的汽车(该信息需要一个特定的对象实例。)

答案 3 :(得分:1)

为此,您需要了解什么是静态的。

静态数据成员对于整个类只存在一次,而非静态数据成员则在每个类的实例中单独存在。它们将具有类范围,并且不绑定到类的实例。

要访问该类的静态成员,我们使用以下格式 ::

如果您创建了一个类的10个对象。 假设,您能够访问类的静态成员中的非静态变量,当调用静态函数时,需要更改哪个对象的成员?