通过对象实例访问私有静态成员

时间:2014-09-24 01:15:46

标签: c++ this

我正在尝试更多地了解静态成员,并且我一直在尝试使用代码片段来查看哪些有效/合法,哪些无效。

我的理解是静态变量不在类/结构内,而是分开的。换句话说,下面代码中的变量y应该由A::y访问而不是this->y,因此我的假设是下面的代码无法编译。我很惊讶它(MingGW)。

有人可以解释一下这种访问机制的工作原理和实施方式。

// ClassA.h
class A{
  private:
    int x;
    static int y;
  public:
    void setX(int x){this->x = x;}
    void setY(int y){this->y = y;}
}

// main.cpp
#include "ClassA.h"

int main (int argc,char* argv[]){
  A my_A;
  my_A.setX(5);
  my_A.setY(10);
  return 0;
}

2 个答案:

答案 0 :(得分:7)

这是有效的,因为语言允许它。 this指针仅用于此上下文中的类型;当发现该成员是静态的时,指针不会被使用。也就是说,编译后的代码根本不会使用指针。

这两个因此等同于 1 ,但编译器可能会发出有关此问题的警告。您应该更喜欢使用类型名称来访问静态成员,因为它更能代表实际发生的事情,因此更加清晰。

进一步阅读:Accessing static members via an instance(包含一些此技术何时有用的示例)


1 当指针或对象是具有副作用的表达式时,情况并非总是如此。例如,给出以下代码:

#include <iostream>

class Foo {
public:
    static int x;
};

int Foo::x = 0;

Foo aFoo;

Foo & test() {
    std::cout << "test()" << std::endl;
    return aFoo;
}

int main(void) {
    test().x = 1;

    return 0;
}

编译器在编译时知道test().x的位置,因为它知道test()返回对Foo的引用,而Foo::x是静态的 - 但即使编译器知道在哪里找到test().x而没有实际发出评估test()的代码它仍会发出函数调用而只是忽略结果,因为替代方案(根本没有调用)可能是偶数更令人困惑。

在此示例中,test().x = 1;相当于(test(), Foo::x = 1);

答案 1 :(得分:0)

  

有人可以解释一下这种访问机制的工作原理

所有编译器需要的是它知道的指针变量的类型。它的实际值被忽略,即使它是空的。

  

并实施

您的示例都编译为相同的代码。