c ++使用成员选择运算符(。或 - >)访问静态成员函数

时间:2011-12-27 07:41:13

标签: c++ visual-c++

我刚注意到我们可以通过成员选择运算符(。或 - >)访问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 -> 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. #1和#3的用例是什么?
  2. #2和#3之间有什么区别?
  3. 用于访问成员函数中的静态成员函数的另一种#1样式是

      void SetY(){
        y = count();                             //however, I regard it as 
      }                                          // StaticTest::count()
    

    但现在看起来更像是 this-> count() 。两种风格的呼唤有什么不同吗?

    由于

3 个答案:

答案 0 :(得分:2)

看看这个question

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

  

可以使用qualified-id引用类X的静态成员   表达式X :: s;没有必要使用类成员访问   语法(5.2.5)引用静态成员。静态成员可以是   引用使用类成员访问语法,在这种情况下   对象表达式进行评估。

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

如果你需要首先创建对象(通过直接实例化对象,或者通过调用某个函数),那么这个创建过程当然会占用一些额外的时间和内存。然而, this -Pointer永远不会传递给静态函数,无论它是如何编写的,调用本身都是一样的。

答案 1 :(得分:1)

我对你的第一个问题的答案感到有些困惑,但关于你的第二个问题:

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

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

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

答案 2 :(得分:1)

C ++ 03,9.4静态成员

  

可以使用qualified-id表达式X :: s引用类X的静态成员;没有必要使用该课程   成员访问语法(5.2.5)来引用静态成员。静止的   可以使用类成员访问语法来引用成员   在哪种情况下评估object-expression。