Объявление функции-члена C ++ статической константой приводит к ошибкам - PullRequest
3 голосов
/ 31 августа 2011

У меня есть следующий интерфейс класса:

class Test
{
public: 
    Test();
    static void fun() const;

private:
    int x;
    static int i;
};

Test.cpp содержит реализацию fun():

void Test::fun() const
{
   cout<<"hello";
}

это дает мне ошибки ... modifiers not allowed on static member functions

Что означает ошибка? Я хочу знать причину, по которой я не могу создать функцию, которая является статической и постоянной.

Ответы [ 6 ]

5 голосов
/ 31 августа 2011
void fun() const;

означает, что fun можно применять как к const-объектам (так и к non-const).Без модификатора const его можно применять только к неконстантным объектам.

Статическим функциям по определению не требуется объект.

2 голосов
/ 31 августа 2011

A функция-член, являющаяся константой, означает, что другие неконстантные члены экземпляра класса не могут быть вызваны .

Свободная функция не является функцией-членом, поэтому она не связана с классом или экземпляром класса, поэтому она не может быть константной, так как нет члена .

Статическая функция - это свободная функция, имя которой находится в пределах имени класса, что делает ее всегда относительной к типу, но не связано с экземпляром этого типа, поэтому для получения доступа по-прежнему нет члена до .

В этих двух последних случаях бессмысленно иметь постоянный доступ, поскольку нет члена, к которому можно получить доступ.

1 голос
/ 31 августа 2011

Статические функции работают без экземпляра, тогда как const гарантирует, что функция не изменит экземпляр (даже если для этого требуется экземпляр).

Это может быть легче понять, если вы видите переведенный код:

   static void fun();

в конце дня переводится в функцию, которая не принимает аргументов, а именно

   void fun();

Для другого примера,

   void fun() const;

в конце дня переводится в функцию вида

   fun(const Test& self)

Таким образом, static void fun() const имеет два противоречивых значения.

Кстати: этот перевод происходит для всех функций-членов (постоянных или нет)

0 голосов
/ 31 августа 2011

Возможно, было бы полезно иметь простой пример кода.

class Foo {
public:
    static void static_function();
    void const_function() const;
};

// Use of static function:
Foo::static_function();

// Use of const function:
Foo f;
f.const_function();

Основное различие между ними состоит в том, что функция const является функцией member - то есть, он вызывается в экземплярах класса Foo.Это означает, что сначала вам нужно создать экземпляр объекта типа Foo, а затем этот объект действует как получатель вызова const_function.Сам по себе const означает, что вы не будете изменять состояние объекта, который является получателем вызова этой функции.

С другой стороны, функция static по сути является свободной функцией, где выМожно назвать это без получения объекта.Вне области действия класса, в котором он определен, однако, вам нужно будет квалифицировать его, используя имя класса: Foo::static_function.

Поэтому не имеет смысла иметь функцию, которая одновременноstatic и const, так как они используются в совершенно разных контекстах.Не нужно беспокоиться об изменении состояния любого объекта при вызове функции static, потому что не не получает объект - он просто вызывается как свободная функция.

0 голосов
/ 31 августа 2011

Я ответил на это несколько часов назад здесь: Почему мы должны ставить const в конце заголовка функции, а сначала статический?

(ТАК система не удовлетворена моим ответом. Автоматически преобразуется в комментарий)

0 голосов
/ 31 августа 2011

Потому что функция класса static const не имеет смысла. const означает, что вещь (объект / переменная) остается неизменной. Статический означает, что вещь object и т. Д. Остается той же в этом контексте.

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