Рассмотрим следующий код:
class Test
{
public:
//1
int kon1() const;
//2
const int kon2();
//3
static int kon3();
};
Насколько я знаю, разница между функцией 1 и 2 заключается в том, что:
(Если у меня неправильное понимание, пожалуйста, поправьте меня)
Мой вопрос:
Как мы видим, если мы хотим сделать функцию константной, ключевое слово const помещается позади. Но почему в функции 3 статическая функция, ключевое слово static помещается впереди?
За const
функции-члены должны иметь const
ключевое слово впоследствии, чтобы избежать неоднозначности с типом возвращаемого значения.
За static
, virtual
и другие ключевые слова, оказывающие существенное влияние на работу функции, желательно сначала перечислить ее, чтобы ее было легче увидеть в определении класса. Например, мы можем быстро просмотреть список функций-членов и определить все static
функции или все virtual
те, которые помогают нам понять общее использование функции.
Маркировка функции-члена const
(или, например, override
) является менее важным различием — если у вас естьconst
объект, который вы можете вызывать функции, являются ли они const
или нет, соответствующий const
-дальности очевидны для читающего разработчика, так как они воспринимают возвращаемый тип функции и идентификатор, а в некоторых корпоративных / проектных стандартах кодирования функции сгруппированы выше const
или const
и неconst
версии одной и той же функции-члена расположены рядом друг с другом, чтобы подчеркнуть их сходство. const
-несс выделяется больше.
Все эти факторы в совокупности делают фактический выбор в C ++ оптимальным для разработки, но вы правы, заметив, что они немного противоречивы.
Вы смешиваете две концепции: класс хранения с типом хранения.
C ++ имеет следующий вид классов хранения
авто, регистр, статический, внешний & изменчивый
И следующий тип хранения (в зависимости от того, что вы можете сделать с хранилищем)
только для чтения (можно инициализировать) -> это const
читать и писать -> это не const.
Поэтому, когда вы определяете переменную / функцию, вы должны заранее сказать, какой тип хранилища вы хотите связать. Вот почему вы ставите static в качестве первого ключевого слова в вашем коде.
Надеюсь это поможет.
Ключевое слово static
не изменяет тип переменной. Он изменяет адрес памяти, в котором он будет расположен. Он используется одинаково для переменных типа функции и для переменных типа данных:
static int n; // data
static int n (); // function
Ключевое слово const
действительно изменяет тип переменной. Для переменных типа функции это ключевое слово имеет два возможных значения:
изменить возвращаемое значение функции как тип const
:
const int n (); // функция может быть вызвана только из неконстантных объектов и возвращает константное значение
изменить способ вызова этой функции
int n () const; // функция может быть вызвана как const, так и неконстантными объектами, и возвращает неконстантное значение`
int kon1() const;
Эта функция предназначена только для чтения и предназначена для работы только с постоянными данными.
const int kon2();
Эта функция может работать с изменяемым объектом, но возвращает тип только для чтения, и вызывающая сторона не может изменить это.