繁体   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