【问题标题】:c++ accessing static member function with member-selection operator (. or –>)c ++使用成员选择运算符(。或->)访问静态成员函数
【发布时间】:2011-12-27 07:41:13
【问题描述】:

我刚刚注意到我们可以通过成员选择运算符(.或->)访问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 有什么区别?

在成员函数中访问静态成员函数的另一种风格#1是

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

但现在它看起来更像 this->count()。两种风格调用有什么区别吗?

谢谢

【问题讨论】:

  • this->count()?那是对的吗。我很困惑!
  • @ErichLancaster,我在 VC 2010 中测试过,可以构建。

标签: c++ visual-c++


【解决方案1】:

看看这个question

按照标准(C++03、9.4静态成员):

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

所以,当你已经有一个对象并且你在它上面调用一个静态方法时,那么使用类成员访问语法就没有什么区别了。

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

【讨论】:

  • 它会影响编译时的名称查找吗?因为给定一个实例或this指针,它与“class::”相比具有不同的含义
  • 好问题。如果,那么可能只有很少;当指定类名时,在符号表中可能会少查找一次(因为在另一种情况下,对于一个对象,必须首先查找该特定对象的类,然后才是类本身)。但如果这对编译时间有任何明显影响,我会感到非常惊讶。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    C++03、9.4 静态成员

    类 X 的静态成员 s 可以使用限定 ID 表达式 X::s 来引用;没有必要使用类 成员访问语法 (5.2.5) 来引用静态成员。一个静态的 可以使用类成员访问语法来引用成员,在 在这种情况下,对象表达式会被计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2016-04-09
      • 1970-01-01
      相关资源
      最近更新 更多