使用对象标识符作为变量名称

时间:2012-09-12 16:18:05

标签: java c++

只是想知道......

使用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

事实证明,这适用于字符串字符串="字符串&#34 ;;同样。并尝试使用Java,也可能。我想它也可能适用于C#,但我还没试过。

有人能告诉我背后的原因以及这是否是故意的特征?

2 个答案:

答案 0 :(得分:2)

n3337 9.1 / 2

类声明将类名引入声明它的范围,并隐藏任何类,变量, 函数或该名称在封闭范围内的其他声明(3.3)。如果在作用域中声明了类名 其中还声明了同名的变量,函数或枚举器,然后是两个声明 在范围内,只能使用精心设计的类型说明符(3.4.4)来引用该类。

n3337 9.1 / 4

[注意:类名的声明在类中看到标识符后立即生效 定义或精细类型说明符。例如, 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
}

编译也很好。

答案 1 :(得分:1)

原因与动态分配无关。相反,它由以下代码说明:

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

在标记为^的位置,声明已完成,circle在当前作用域中称为变量。所以你试图做new variablename()这不起作用。