2012-09-12 53 views
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」;以及。並嘗試與Java,也可能。我想它可能也適用於C#,但我沒有嘗試過。

有誰能告訴我背後的原因以及這是否是故意的功能?

+1

'circle * circle = new circle();'這難道不會讓你有點神祕嗎? – Wug

+1

它的確如此。我想知道爲什麼「圈子圈子」被允許工作。 – user1144762

+2

在(幾乎)所有上下文中,編譯器都可以推導出哪些是標識符,哪些是類型。所以是的,這是一個有意圖的功能。 –

回答

2

n3337 9.1/2

類聲明引入類名進入它被聲明和隱藏任何類,變量, 功能,或者在一個封閉的範圍(3.3),該名稱的其他聲明的範圍。如果在 範圍內聲明瞭一個類名,並且同時聲明瞭同名變量,函數或枚舉器,則當兩個聲明 都在範圍內時,該類只能使用詳細類型說明符引用( 3.4.4)。

n3337 9.1/4

[注:一個類名稱的聲明採用標識符是出現在類定義 或闡述型說明符後立即生效。例如, class 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 
} 

也編譯得很好。

+0

明白了!謝謝! – user1144762

1

原因與動態分配無關。更確切地說,它是由該代碼所示:

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

在點標記^,聲明完成並circle在當前範圍作爲可變已知的。所以你正在試圖做new variablename()這是行不通的。

+0

明白了。謝謝! – user1144762