«статический» для функций-членов класса С ++? - PullRequest
4 голосов
/ 25 февраля 2010

Зачем вообще нужно статическое ключевое слово?

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

следующим образом:

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

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

Ответы [ 5 ]

7 голосов
/ 25 февраля 2010

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

4 голосов
/ 25 февраля 2010

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

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

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

1 голос
/ 25 февраля 2010

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

0 голосов
/ 25 февраля 2010

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

0 голосов
/ 25 февраля 2010

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

...