只是想知道......
使用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#,但我还没试过。
有人能告诉我背后的原因以及这是否是故意的特征?
答案 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()
这不起作用。