c++;使用成员选择运算符(.or–;>;)访问静态成员函数 我注意到,我们可以通过成员选择运算符(.OR或>)访问C++静态成员函数< /P>

c++;使用成员选择运算符(.or–;>;)访问静态成员函数 我注意到,我们可以通过成员选择运算符(.OR或>)访问C++静态成员函数< /P>,c++,visual-c++,C++,Visual C++,例如: class StaticTest { private: int y; static int x; public: StaticTest():y(100){ } static int count() { return x; } int GetY(){return y;} void SetY(){ y = this->count(); //#1 accessing with ->

例如:

class StaticTest
{
private:
  int y;
  static int x;
public:
  StaticTest():y(100){

  }
  static int count()
  {
    return x;
  }
  int GetY(){return y;}
  void SetY(){
    y = this->count();                         //#1 accessing with -> operator 
  }
};
以下是如何使用

  StaticTest test;
  printf_s("%d\n", StaticTest::count());      //#2
  printf_s("%d\n", test.GetY());
  printf_s("%d\n", test.count());             //#3 accessing with . operator 
  test.SetY();
  • #1和#3的用例是什么
  • 2和3之间有什么区别
  • 用于访问成员函数中静态成员函数的#1的另一种样式是

      void SetY(){
        y = count();                             //however, I regard it as 
      }                                          // StaticTest::count()
    
    但是现在它看起来更像这个->计数()。两种通话方式有什么不同吗


    谢谢

    我对第一个问题的答案有点困惑,但关于第二个问题:

    在#2中(
    StaticTest::count()
    ),您以静态方式使用了count()方法,这意味着您在不创建StaticTest对象的情况下调用了函数

    在#3(
    test.count()
    )中,您创建了一个名为test的StaticTest对象,并通过该对象调用了该方法(尽管它是不必要的)

    在功能上没有区别,但是#2是调用StaticMethods的首选方式。在不需要的时候创建对象是对内存的不好使用。

    看看这个

    根据标准(C++03,9.4静态成员):

    类X的静态成员s可以使用限定id引用 表达式X::s;不必使用类成员访问权限 引用静态成员的语法(5.2.5)。静态成员可以是 指使用类成员访问语法,在这种情况下 计算对象表达式

    因此,当您已经拥有一个对象并且正在对其调用一个静态方法时,使用类成员访问语法是没有区别的


    但是,如果您需要首先创建对象(无论是通过之前直接实例化对象,还是通过调用某些函数),那么这个创建过程当然会占用一些额外的时间和内存。但是,this指针永远不会传递给静态函数,调用本身始终是相同的,无论它是如何编写的。

    C++03,9.4静态成员

    类X的静态成员s可以使用限定id表达式X::s引用;不必使用该类 引用静态成员的成员访问语法(5.2.5)。静电计 在中,可以使用类成员访问语法引用成员 在这种情况下,将计算对象表达式


    这个->计数()
    ?对吗。我糊涂了@ErichLancaster,我在VC 2010中测试过,它可以被构建。它会影响编译时的名称查找吗?因为给定一个实例或这个指针,它与“class::”这个好问题相比有不同的含义。如果,那么可能只有很少;指定类名时,符号表中的查找可能会少一次(因为在另一种情况下,对于对象,必须首先查找该特定对象的类,然后才查找该类本身)。但如果这对编译时间有任何明显的影响,我会非常惊讶。