1

私は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 ++をベースとしているため、2つの言語の間にこの違いをもたらす具体的な理由が必要です。

4

1 に答える 1

2

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 ++では、静的const積分データメンバーのみがクラス内で初期化できます

では、なぜそれが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

于 2013-02-19T05:25:54.640 に答える