Почему мы должны поместить const в конец заголовка функции, но вначале static? - PullRequest
9 голосов
/ 30 августа 2011

У меня есть такой код ...

class Time
{
    public: 
        Time(int, int, int);
        void set_hours(int);
        void set_minutes(int);
        void set_seconds(int);

        int get_hours() const;
        int get_minutes() const;
        int get_seconds() const;

        static void fun() ;

        void printu() const;
        void prints();

    private:
        int x;
        int hours;
        int minutes;
        int seconds;
        const int i;
};

Почему мне нужно, наконец, поставить const, чтобы сделать тип функции постоянным, но если мне нужно сделать функцию, я могу сделать это как ...

static void Time::fun() 
{
    cout<<"hello";
}

Над функцией fun() также находится в том же классе. Я просто хочу знать, в чем причина этого?

Ответы [ 7 ]

13 голосов
/ 30 августа 2011

с методом экземпляра const, таким как int get_hours() const;, const означает, что определение int get_hours() const; не изменит this.

со статическим методом, таким как static void fun();, const не применяется, поскольку this недоступен.

вы можете получить доступ к статическому методу из класса или экземпляра из-за его видимости. более конкретно, вы не можете вызывать методы экземпляра или обращаться к переменным экземпляра (например, x, hours) из статического метода, потому что нет экземпляра.

class t_classname {
public:
  static void S() { this->x = 1; } // << error. this is not available in static method
  void s() { this->x = 1; } // << ok
  void t() const { this->x = 1; } // << error. cannot change state in const method
  static void U() { t_classname a; a.x = 1; } // << ok to create an instance and use it in a static method
  void v() const { S(); U(); } // << ok. static method is visible to this and does not mutate this.

private:
  int a;
};
11 голосов
/ 30 августа 2011

const в конце означает, что функция постоянна, поэтому она не меняет состояние объекта.

Когда вы ставите const в конце, вы не можете изменить состояние членов объекта.

Объявление функции static означает, что она вообще не принадлежит объекту, она относится к типу класса.

Помещение const в начало означает, что возвращаемое значение типа является константой.

4 голосов
/ 30 августа 2011

Когда вы помещаете const в начале, вы применяете его к типу возвращаемого значения.Это не имеет значения, если вы возвращаете тип, если void, но допустим, что вы возвращаете char*, который не является константой.Если вы поместите const в начале, вы получите

static const char* MyFunction() { ... }

Это говорит мне, что тип возвращаемого значения - const char*, а не функция const, которая возвращает char*.

Помещение в конец позволяет избежать этой проблемы.

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

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

1 голос
/ 08 марта 2019

Это потому, что если вы поместите const первым, это будет означать, что вы возвращаете const вещь из функции

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

Это чисто грамматическая проблема.const является cv-qualifier и, применительно к функции-члену, должен быть помещен после объявления параметров.Если вы попытались поместить его перед именем функции, его можно интерпретировать только как уточняющий тип возвращаемого значения функции.

static, с другой стороны, является спецификатором класса хранения и должен появляться перед деклараторомк которому это относится.

Эти правила просто вытекают из способа определения грамматики C ++.

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

То и другое объясняется немного подробнее здесь .Помещение const после объявления функции делает функцию постоянной, что означает, что она не может ничего изменить в объекте, который содержит функцию.

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