c ++ доступ к статической функции-члену с помощью оператора выбора члена (. или ->) - PullRequest
2 голосов
/ 27 декабря 2011

Я только что заметил, что мы можем получить доступ к статической функции-члену 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 () .Есть ли разница между двумя стилями звонков?

Спасибо

Ответы [ 3 ]

2 голосов
/ 27 декабря 2011

Посмотрите на этот вопрос .

Согласно стандарту (C ++ 03, 9,4 статических члена):

Статический член класса X может быть передан с использованием квалифицированного идентификатора. выражение X :: s; нет необходимости использовать доступ к классу синтаксис (5.2.5) для ссылки на статический член. Статический член может быть упоминается с использованием синтаксиса доступа члена класса, в этом случае выражение объекта оценивается.

Итак, если у вас уже есть объект и вы вызываете статический метод, нет никакой разницы в использовании синтаксиса доступа к членам класса.

Если вам, однако, нужно сначала создать объект (будь то путем создания экземпляра объекта непосредственно перед или путем вызова некоторой функции), тогда этот процесс создания, конечно, займет немного больше времени и памяти. Однако this -Pointer никогда не передается статической функции, сам вызов всегда одинаков, независимо от того, как он был написан.

1 голос
/ 27 декабря 2011

C ++ 03, 9,4 статических члена

На статический член класса X можно ссылаться с помощью выражения квалифицированного идентификатора X :: s; не нужно использовать класс синтаксис доступа к элементу (5.2.5) для ссылки на статический член. Статический член может быть передан с использованием синтаксиса доступа члена класса, в в каком случае вычисляется объект-выражение.

1 голос
/ 27 декабря 2011

Я немного озадачен ответом на ваш первый вопрос, но что касается вашего второго вопроса:

в # 2 (StaticTest::count()), вы использовали метод count () в статическомТаким образом, вы вызвали функцию без создания объекта StaticTest.

в # 3 (test.count()), вы создали объект StaticTest с именем test и вызвали метод через объект (даже если это было ненужным.)

Функционально разницы нет, но # 2 является предпочтительным способом вызова StaticMethods.Создание объекта, когда он не нужен, - плохое использование памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...