之间的差异.和::在C++中用于静态成员

Difference between . and :: in C++ for static members?

本文关键字:C++ 用于 静态成员 之间      更新时间:2023-10-16

可能重复:
在C++中,我什么时候使用句点、箭头或双冒号来指代类的成员?

当我尝试使用Class.Variable访问静态变量时,我会得到Error left of 'Variable' must have class/struct/union的错误,而当我使用Class::Variable时,我不会得到错误。尽管在这两种情况下,我都是通过intellisense获得Variable的。在这种情况下,.::之间到底有什么不同?

类的静态成员可以通过两种方式访问

(a( 使用类的实例-使用.,例如obj.variable

(b( 没有类的实例-使用::,例如class::variable

.用于对象::用于类名。

 struct foo {
     int x;
     static int y;
 };
 foo bar;
 bar.x = 10; // ok
 bar.y = 20; // ok - but bad practice
 foo.x = 10; // WRONG foo is class name
 foo.y = 20; // WRONG foo is class name
 foo::x = 10; // WRONG x requires object
 foo::y = 20; // ok

最佳实践:

 bar.x = 10; 
 foo::y = 20;

.是一个实例引用(例如,在LHS上有一个对象(。::是一个静态引用。RHS上有一个类型。

Class::StaticProperty
InstanceOfClass.Property

::用于类/命名空间范围,但在这种情况下,.的左侧必须是一个变量。请注意,这是可行的,这可能就是为什么Intellisense也适用于您的原因:

Class x;
doSomething( x.Variable );
点运算符,也称为"类成员访问运算符",需要一个类/结构的实例。
struct X
{
    static int x = 5;
    int y = 3;
}
namespace NS
{
    int z = 1;
}
void foo()
{
    X instance;
    instance.x;  // OK, class member access operator
    X::x;        // OK, qualified id-expression
    instance.y;  // OK
    X::y;        // Not OK, y is not static, needs an instance.
    NS.z;        // Not OK: NS is not an object
    NS::z;       // OK, qualified-id expression for a namespace member.
}

该措辞取自C++0x FDIS。