I'm trying to understand Scope resolution operator ::
I know I can only access static class member via Scope resolution operator.
But I can use it to access typedef or a nested class thing like this:
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;
}
I can instantiate an in-class type object via ::
such as line 1
and line 2
I can use typedef to instantiate an object such as line 3
I can't access non-static members via ::
such as line 4
Is that mean an in-class class and typedef is a static member in a class? I know namespace is quite equal to class name but I'm still really getting confused about it.
By the way, for the typedef part, can I simply think tt3
is int
type rather than test::testdef
type?
CodePudding user response:
I can't access non-static members via
::
such asline 4
False. The problem is that you cannot access non-static members without an object. If you have an object, you can use a qualified name (with ::
).
int main()
{
test t;
t.test::s = 5;
//^^^^^^
}
Is that mean an in-class class and typedef is a static member in a class?
It depends what you mean by "static member". They do not require an object of the class, but at the same time they do not require the static
keyword. (My understanding is that in the official terminology, nested types and typedefs are not considered "members", so in that respect they are not static members. However, I think that might be side-stepping the intended question.)
By the way, for the typedef part, can I simply think
tt3
isint
type rather thantest::testdef
type?
Up to you. A typedef
creates an alias, so int
and test::testdef
are two names for the same thing. If you prefer thinking in terms of int
, do that. If you prefer thinking in terms of test::testdef
, do that. The type doesn't mind which name you use.
(The same would hold if the typedef
was outside a class definition. You are making the situation less clear for yourself by thinking that the class makes a difference in this case. A typedef
defines an alias for a type.)