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

事实证明,这适用于 string string = "string"; 也是。并用Java尝试过,也可能。我想它也可能适用于 C#,但我还没有尝试过。

谁能告诉我这背后的原因以及这是否是故意的功能?

4

2 回答 2

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
}

编译也很好。

于 2012-09-12T16:30:46.463 回答
1

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

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

在标记点处^,声明已完成,并且circle在当前范围内被称为变量。因此,您正在尝试做new variablename()哪些行不通。

于 2012-09-12T16:31:24.933 回答