[英]How to understand Using :: (Scope resolution operator) to access a in-class class (nested class) or typedef
我正在嘗試了解范圍解析運算符::
我知道我只能通過 Scope 解析運算符訪問靜態類成員。
但我可以使用它來訪問 typedef 或嵌套類,如下所示:
class test{
public:
class testinner{
public:
int _val;
testinner(){}
testinner(int x):_val(x){}
};
test(){}
typedef int testdef;
int s;
};
int main()
{
test::testinner tt1 = test::testinner(5); //OK LINE(1)
test::testinner tt2; //OK LINE(2)
test::testdef tt3 = 5; //OK LINE(3)
test::s = 5; //non static member ERROR LINE(4)
return 0;
}
我可以通過::
實例化一個類內類型對象,例如line 1
line 2
我可以使用 typedef 來實例化一個對象,例如line 3
我無法通過::
訪問非靜態成員,例如line 4
這是否意味着類內類和 typedef 是類中的靜態成員? 我知道命名空間完全等於類名,但我仍然對此感到困惑。
順便說一句,對於 typedef 部分,我可以簡單地認為tt3
是int
類型而不是test::testdef
類型嗎?
我無法通過
::
訪問非靜態成員,例如line 4
錯誤的。 問題是您不能在沒有對象的情況下訪問非靜態成員。 如果你有一個對象,你可以使用一個限定名(帶::
)。
int main()
{
test t;
t.test::s = 5;
//^^^^^^
}
這是否意味着類內類和 typedef 是類中的靜態成員?
這取決於您所說的“靜態成員”是什么意思。 它們不需要類的對象,但同時它們也不需要static
關鍵字。 (我的理解是,在官方術語中,嵌套類型和 typedef 不被視為“成員”,因此在這方面它們不是靜態成員。但是,我認為這可能會回避預期的問題。)
順便說一句,對於 typedef 部分,我可以簡單地認為
tt3
是int
類型而不是test::testdef
類型嗎?
由你決定。 typedef
創建一個別名,因此int
和test::testdef
是同一事物的兩個名稱。 如果您更喜歡用int
來思考,那就這樣做吧。 如果您更喜歡從test::testdef
的角度來思考,那就這樣做吧。 該類型不介意您使用哪個名稱。
(如果typedef
在類定義之外,情況也是如此。通過認為類在這種情況下有所不同,您會讓情況變得不太清楚typedef
定義了類型的別名。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.