簡體   English   中英

如何理解使用 ::(范圍解析運算符)訪問類內類(嵌套類)或 typedef

[英]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 部分,我可以簡單地認為tt3int類型而不是test::testdef類型嗎?

我無法通過::訪問非靜態成員,例如line 4

錯誤的。 問題是您不能在沒有對象的情況下訪問非靜態成員。 如果你有一個對象,你可以使用一個限定名(帶:: )。

int main()
{
    test t;
    t.test::s = 5;
    //^^^^^^
}

這是否意味着類內類和 typedef 是類中的靜態成員?

這取決於您所說的“靜態成員”是什么意思。 它們不需要類的對象,但同時它們也不需要static關鍵字。 (我的理解是,在官方術語中,嵌套類型和 typedef 不被視為“成員”,因此在這方面它們不是靜態成員。但是,我認為這可能會回避預期的問題。)

順便說一句,對於 typedef 部分,我可以簡單地認為tt3int類型而不是test::testdef類型嗎?

由你決定。 typedef創建一個別名,因此inttest::testdef是同一事物的兩個名稱。 如果您更喜歡用int來思考,那就這樣做吧。 如果您更喜歡從test::testdef的角度來思考,那就這樣做吧。 該類型不介意您使用哪個名稱。

(如果typedef在類定義之外,情況也是如此。通過認為類在這種情況下有所不同,您會讓情況變得不太清楚typedef定義了類型的別名。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM