4

このコードを考えてみましょう:

#include<iostream>
using namespace std;
class Wilma
{
    public:
        static int i;
        Wilma()
        {
            cout<<"\nWilma ctor\n";
            cout<<"\ni::"<<i<<"\n";
        }
};
class Fred
{
    public:
        Fred()
        {
            cout<<"\nFred ctor\n";

        }
        static Wilma wilma_;
};
int Wilma::i=44;//------------- LINE A
int main()
{
    int a=0;
    Wilma::i=a;//---------- LINE C
    Wilma w;
    Fred::wilma_=w;//---------- LINE B

}

ここで、行AはWilmaクラスの静的int aを明示的に定義し(リンカーエラーを引き起こすためにコメントアウトされています)、それがないとリンカーは未定義の参照エラーを出します(Wilma :: iが実際に使用されているため、使用しない場合はリンカーエラーはありません)ある。)

Fredクラスの静的Wilmawilma_についても同じことが言えます。つまり、B行のコードでも使用されているため、明示的に定義する必要があります。ただし、そうではない場合、Fred::wilma_のリンカーエラーはありません。明示的に定義されていません。なぜ?gcc4.5.2でテスト済み

編集: 私はどういうわけかこれについて別の疑問を持っています...

LINECLINEBint Wilma::iはどちらも、それぞれクラスの静的オブジェクトを使用しようとしていますWilma Fred::wilma_。しかし、の定義だけint Wilma::iが必須ですか?

なぜWilma Fred::wilma_;必須ではないのですか?

行Bはノーオペレーションであるという答えを理解しています。でもC線についても同じことが言えますか?

4

2 に答える 2

3

Wilma非静的フィールドはありません。Fred::wilma_=w;何もしません。

編集

非静的メンバーがない場合-コピーはありません。基本的に、割り当ては何も行われず、コンパイラによって最適化されただけであり、リンカはそれを認識しませんでした。非静的メンバーを追加すると、コピーが静的変数を参照する実際の操作になるため、コンパイラーはそれを最適化できず、リンカーはそれを認識しました。

于 2011-07-12T20:04:10.190 に答える
1

で宣言static int i;しましたWilmaが、定義していません。したがって、行Aに追加し直すと、Wilma :: iが定義されます。これは、コンパイラが不満を言っていることです。したがって、mainの内部ではなく、クラスの外部のどこかに定義する必要があります。

最後に、FredクラスとWilmaクラスは基本的に空です(ctorとstaticクラスのメンバーは別として)。それらの間でコピーするものは何もありません。

編集:@littleadvへのコメントに基づいて、コピーを実行する場合は、同じクラスが必要です。Int jをWilmaクラスに配置し、Fredクラスには何も配置しない場合、jをFredクラスのどこに配置する必要があるため、機能しません。

于 2011-07-12T20:15:00.910 に答える