2010-02-18 35 views
3

如果一個新的類型聲明whithin類,如:類中的類型聲明的範圍是什麼?

class foo { 
public : 
    struct s1 { 
     int a ; 
    }; 
private : 
    struct s2 { 
     int b ; 
    }; 
}; 

那麼在什麼範圍內可在下列語句中使用:提前

s1 ss1; 
s2 ss2; 

感謝。

+0

這是功課嗎? – unwind 2010-02-18 13:04:52

+1

嗯,我放棄了在此引用標準。這是皮塔餅。 – 2010-02-18 14:22:52

回答

7

類型S1可以在任何地方使用,但如果使用的Foo的成員函數外,它必須是合格的:

foo::s1 ss1; 

類型s2只能用於foo的成員函數。

+0

Nitpick,從foo繼承的類中不需要foo :: qualified。 – AProgrammer 2010-02-18 13:24:41

+1

...'s2'也可以在朋友函數或類中的'foo'方法之外使用合格的名稱。有兩個不相關的功能,需要使用範圍限定符,並且可以使用不同訪問級別(公共/受保護/專用)中的元素。 – 2010-02-18 13:28:16

+0

即使在成員函數之外,它也可以在課堂範圍內無限制地使用。 – 2010-02-18 13:45:27

1

根據您的示例,兩者都只能在類foo內使用。隨着預選賽,不過,s1也可以外foo使用,像

foo::s1 ss1; 
1

有兩個不同的問題:我可以在哪裏使用不合格的短名稱,以及哪裏可以訪問每種類型。

只要處於類範圍內,就可以使用內部類型的非限定名稱。這將在類聲明中,並且在給定類或派生​​類的方法的定義中不隱藏名稱(關於包含模板的層次結構中的依賴名稱還有一些其他細節,但可能不在該範圍之外的問題)。

第二個問題是您可以在哪裏訪問公共類和私人類的成員。你可以訪問同一個類中的私有成員(包括類型),以及在類聲明後被聲明爲該類的朋友的任何類或函數。在編譯器看到該類的聲明後,可以從任何地方訪問公共成員。

1

嵌套類的範圍限於封閉類。這兩個類不能在foo之外訪問。

但是,類s1 & s2之間存在差異。 您不能在foo之外創建s2的對象。

您可以使用Foo中的完全限定名稱在foo外部創建s1的對象:s1 fs1; 繼承Foo的類將能夠訪問s1,但不能訪問s2。