我有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
如何在这里工作(在两个代码中)?相对比较对我来说已经足够了。
答案 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
静态会给你不同的结果。