2011-07-20 11 views
3

私のコースノートには、「C++ではブロック内で使用する前に宣言する必要がありますが、型内では宣言する必要がありますが、型内では宣言する必要はありません。C++で使用する前の宣言のルールは何ですか?

この意味は?

int f() { 
    if (i) 
    return i; 
    int i = 1; //allowed? 
    return 0; 

} 

//not allowed? 
int g() { 
    if (i) 
     return i; 
    return 0; 
} 

int i = 1; 

答えて

13

いいえ両方の例は「ブロック内」であり、どちらも許可されていません。サンプルコードをコンパイルしようとすると、すぐにエラーが発生します。

しかし、これは許可されます:

class Foo { 
    int f() { 
     return i; 
    } 

    private: 
    int i; 
}; 

は、これはタイプ内あり、それは重要な区別です。

4

どちらも間違っています。正しい形式は次のとおりです。

int f() { 
    int i = 1; 
    if (i) 
    return i; 
} 

int f() { }はブロックです。ブロック内で使用するには、iを宣言する必要があります。

4

両方は許可されません。次されているが許可されている何 :ここ

struct F { 
    void f() 
    { 
     if(i) return i; 
    } 

    int i; 
}; 

F型、ユーザー定義の構造タイプです。これは「タイプ内」の意味です。あなたの例は両方とも「ブロック内」のケースにあります。

1

C++では、ブロックで使用する前に宣言が必要です。しかし、struct/classでは、この宣言は、このオブジェクトが作成されるたびに暗黙的に宣言されます。その変数にメモリを割り当てるデフォルトのコンストラクタが呼び出され、未定義の型の問題が否定されます。

これは私の理解です。もし間違っていれば、派生データ型メンバーのreqdメモリ空間をコンパイラがどのように知っているのか教えてください。

関連する問題