我試圖了解范圍決議運算子::
我知道我只能通過范圍決議運算子訪問靜態類成員。
但我可以使用它來訪問 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型別嗎?
uj5u.com熱心網友回復:
我無法通過
::諸如訪問非靜態成員line 4
錯誤的。問題是您不能在沒有物件的情況下訪問非靜態成員。如果您有一個物件,您可以使用一個限定名稱(帶有::)。
int main()
{
test t;
t.test::s = 5;
//^^^^^^
}
這是否意味著類內類和 typedef 是類中的靜態成員?
這取決于您所說的“靜態成員”是什么意思。它們不需要類的物件,但同時它們也不需要static關鍵字。(我的理解是,在官方術語中,嵌套型別和 typedef 不被視為“成員”,因此在這方面它們不是靜態成員。但是,我認為這可能會回避預期的問題。)
順便說一句,對于 typedef 部分,我可以簡單地認為
tt3是int型別而不是test::testdef型別嗎?
由你決定。Atypedef創建一個別名,因此int和test::testdef是同一事物的兩個名稱。如果您更喜歡用 來思考,int那就這樣做吧。如果您更喜歡用 來思考,test::testdef那就這樣做吧。該型別不介意您使用哪個名稱。
(如果typedef是在類定義之外,情況也是如此。通過認為類在這種情況下有所不同,您會使情況變得不那么清楚。Atypedef定義了型別的別名。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/490902.html
