在这里无法理解静态概念的工作原理

时间:2015-01-27 14:52:19

标签: java c++ static

我有java代码:

public class Test1
{
 public static void main(String args[])
 {
    t();t();t();
 }
 public static void t()
 {
   int i=0;
   i++;
   System.out.println(i);
 }
}

这给出了输出:

1 
1 
1

我无法与此C ++代码匹配:

  #include<iostream>
  using namespace std;
  int static t();
  int main()
  {
   t();
   t();
   t();
  }
  int  static t()
  {
   int i = 0;
   i++;
   cout<<i;
  }

这也给出了

1
1
1

我认为(如在Java案例中)一个静态main有一个与之关联的静态方法t()

但正如您所看到的,在C ++中main不是静态的,所以我对C ++代码如何提供与Java相同的输出感到有点困惑,即使没有静态main。这不会影响它的工作方式吗?

或者更准确的问题是:static如何在这里工作(在两个代码中)?相对比较对我来说已经足够了。

2 个答案:

答案 0 :(得分:3)

在Java中,静态方法与类关联,可以在没有实例的情况下调用。因此也无法访问实例变量。

在c ++中,static关键字具有多种含义,具体取决于上下文。静态成员函数(通常在c ++中调用的类方法)与Java中的静态方法非常相似。

但是,int main()int static t()都不是成员函数。他们是免费的功能,与任何课程无关。声明一个自由函数static给它内部链接。这意味着它对其他编译单元(.cpp文件)中的函数不可见。

静态或非静态函数不会影响t()在任一版本的代码中的工作方式。您始终打印局部变量并递增它。由于变量没有静态存储持续时间(关键字静态的另一个用途)也不是对象实例的成员,而是自动局部变量,一旦函数调用结束就会被销毁,因此递增的值永远不会用于任何事情。另一方面,如果变量被声明为静态,那么您将获得输出&#34; 1 2 3&#34;。

在Java中,没有自由函数,也没有静态存储持续时间的局部变量。

答案 1 :(得分:1)

Java和CPP的入口点要求不同。 Java要求main为 static ,它作为入口点。

不要以这种方式比较语言

此外,i的值始终为1,因为它是方法 local 变量。使i静态会给你不同的结果。