2010-02-25 5 views
4

Почему статическое ключевое слово необходимо вообще?«статические» для функций класса класса C++?

Почему компилятор не может определить, является ли он «статическим» или нет?

Как следует:

Может ли я скомпилировать эту функцию без доступа к нестатическим данным членов? Да -> статическая функция. Нет -> нестатическая функция.

Есть ли причина, по которой это не делается?

ответ

7

Если вы ожидаете, что компилятор решит на месте, является ли он статичным или нет, как это влияет на внешние исходные файлы, связанные с файлом заголовка, который просто определяет сигнатуры метода?

+1

+1 для спот-ответа ..... –

1

Да, компилятор может, но он не знает ваших намерений. И оригинальные дизайнеры, вероятно, думали, что важно, чтобы ваши намерения были важны.

0

Имея избыточность в этом языке, вы можете гарантировать, что многие ошибки программиста попадут в компилятор.

0

Другая причина: Если эта функция является статической, ее нельзя переопределить в производных классах. Полиморфизм не существует.

+0

Это виртуальный, а не статический. Как статические, так и нестатические базовые элементы могут быть скрыты производными классами, например, std :: fstream :: rdbuf. – 2010-02-25 02:51:55

+0

@Roger: Он спрашивает, почему методы, которые не имеют доступа к каким-либо переменным-членам, не просто автоматически объявляются компилятором как 'static'. Я говорю, что виртуальные методы могут или могут не обращаться к переменным-членам, но вы не хотите, чтобы компилятор автоматически объявлял их статическими. –

+0

Виртуальный метод, просто благодаря виртуальности, всегда подразумевает доступ к переменным-членам. А именно, vtable. И поскольку мы говорим только о неявном статическом, а не неявном виртуальном, любой метод, помеченный как виртуальный, никогда не будет иметь право на автоматическую классификацию как статическую. –

4

Право на статическую или нестационарную работу влияет на тип функции. Нестатические функции-члены имеют неявный параметр this, а для статических - нет.

Другими словами, существует существенное качественное различие между статическими и нестационарными функциями-членами. Компилятор не может «вывести» это. Это вопрос намерения автора.

Если я хочу (и нуждаюсь), чтобы моя функция была нестатической, я делаю ее нестатической, даже если она не имеет доступа к нестационарным членам класса. Если компилятор решительно решает сделать мою нестационарную функцию статической только потому, что она не имеет доступа к нестационарным членам класса, в общем случае она разрушит функциональность кода.

Смежные вопросы