正在初始化非静态成员:C++和Java比较

Initializing non static member : C++ and Java comparison

本文关键字:C++ Java 比较 静态成员 初始化      更新时间:2023-10-16

我有C++背景,正在学习Java。

在C++中,我们不能在类定义中初始化非静态成员,如下所示:

#include <iostream>

using namespace std;
class myClass{
    int i=10;//Error
    public:
    void set_i()
    {
        i=10;
        }
    void get_i()
        {
            cout << i << endl;
        }
};

int main()
{
 myClass ob;
 ob.set_i();
 ob.get_i();

 return 0;
    }

抛出编译错误:

$ g++ -Wall Test.cpp -o Test
Test.cpp:8: error: ISO C++ forbids initialization of member `i'
Test.cpp:8: error: making `i' static
Test.cpp:8: error: ISO C++ forbids in-class initialization of non-const static member    `i'

但它在Java中是允许的:

class Test{
    private int i=10; //No Error
    public static void main(String[] args)
    {
        Test t= new Test();
        System.out.println(t.i);
        }
    }

它在JAVA中成功编译并运行。

有人能告诉我造成这种差异的原因吗?

感谢

@那些认为这个问题毫无用处的人。这是一个有效的问题:

基于以下参考:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr038.htm

"一旦定义了静态数据成员,即使不存在静态数据成员类的对象,它也会存在。"

这意味着:C++不允许这样做,因为除非首先创建类的对象,否则不会为该数据变量创建实例。如果java不是这样,那么这意味着即使没有创建该类的对象,数据成员的实例也确实存在。

Java也以C++为基础,所以这两种语言之间一定有一些具体的区别。

在c++中,尝试以下

#include <iostream>

using namespace std;
class myClass{
    int i;
    public:

        myClass()
        {
            i=10;
        }
    void set_i()
    {
        i=10;
        }
    void get_i()
        {
            cout << i << endl;
        }
};
int main()
{
 myClass ob;
 ob.set_i();
 ob.get_i();
 system("pause");
 return 0;
    }

现在检查以下

#include <iostream>

using namespace std;
class myClass{
    int static const i=0;
    public:

        myClass()
        {
            //i=10;
        }
    void set_i()
    {
       // i=10;
        }
    void get_i()
        {
            cout << i << endl;
        }
};
int main()
{
 myClass ob;
 ob.set_i();
 ob.get_i();
 system("pause");
 return 0;
    }

为什么上述方法有效?很简单,在C++中,只有静态常量积分数据成员才能在类中初始化

那么,为什么它能在Java中工作呢?因为那是Java!不是C++!我同意你的观点,"Java是基于C++的"。好吧,但那不是C++,不是吗?Java和C++之间有很大的区别,不要试图比较它们,也不要期望以完全相同的方式来处理它们。在大多数情况下,这是不会发生的。

在java中,它将默认值"0"应用于所有整数类型,但正如您所知,C++不会(除非它是"静态"的)。换句话说,Java调用它们自己的类(实际上是类构造函数)并将它们初始化为0。只要创建一个数据类型int,就会发生这种情况。Java对其基元类型也会执行同样的操作。这可能是我们被允许在任何方法之外为变量赋值的原因。请参阅以下文档了解更多

http://www.java2s.com/Tutorial/SCJP/0020__Java-Source-And-Data-Type/AutomaticInitializationDefaultValuesforPrimitiveTypes.htm