[英]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.