3

ただ疑問に思う...

C ++をいじってみるとcircle、というクラスを作成してから、クラスの名前とまったく同じ名前の変数を宣言しても、コンパイラは文句を言わないことがわかりました。例えば:

class circle {
  // whatever it does in here
};

circle circle;   // is a valid statement, but
circle *circle = new circle();  // gives you a 'circle' is not a type complain

これはstringstring="string";に当てはまることがわかります。同じように。そして、Javaで試してみました。C#でも動作する可能性があると思いますが、試したことはありません。

この背後にある理由と、これが意図的な機能であるかどうかを誰かに教えてもらえますか?

4

2 に答える 2

2

n3337 9.1 / 2

クラス宣言は、クラス名を宣言されたスコープに導入し、クラス、変数、関数、またはその名前の他の宣言を囲んでいるスコープ(3.3)に隠します。同じ名前の変数、関数、または列挙子も宣言されているスコープでクラス名が宣言されている場合、両方の宣言がスコープ内にある場合、クラスは精巧な型指定子を使用してのみ参照できます(3.4。 4)。

n3337 9.1 / 4

[注:クラス名の宣言は、クラス定義またはelaborated-type-specifierに識別子が表示された直後に有効になります。たとえば、クラスA * A; 最初にAをクラスの名前として指定し、次にそれをそのクラスのオブジェクトへのポインターの名前として再定義します。これは、クラスを参照するために、精巧なフォームクラスAを使用する必要があることを意味します。このような名前の芸術性は混乱を招く可能性があるため、避けるのが最善です。—エンドノート]

それで。

class circle {
  // whatever it does in here
};

int main()
{
circle *circle;  // gives you a 'circle' is not a type complain
}

うまくコンパイルします。

class circle {
  // whatever it does in here
};

int main()
{
circle *circle = new class circle();  // gives you a 'circle' is not a type complain
}

コンパイルもうまくいきます。

于 2012-09-12T16:30:46.463 に答える
1

その理由は、動的割り当てとは何の関係もありません。むしろ、それはこのコードによって示されています:

// declaration    | initialisation
// ---------------+---------------
   circle *circle = new circle(); 
//                  ^

とマークされた時点^で、宣言は完了circleし、現在のスコープでは変数として認識されます。new variablename()だからあなたはうまくいかないことをしようとしています。

于 2012-09-12T16:31:24.933 に答える