Чем отличается «метод» от «функции»
Неоднократно видел использование термина «метод» для обозначения функций-членов классов в противоположность термину «функция» для обозначения «свободных» функций нечленов. С другой стороны, в текстах о Си++, часто всё называют «функцией» и члены и нечлены. Собственно, какова разница между терминами «метод» и «функция», почему в Си++ члены не называют «методами»?
Отслеживать
задан 30 окт 2017 в 7:28
6,853 2 2 золотых знака 23 23 серебряных знака 43 43 бронзовых знака
почему в Си++ члены не называют «методами»? — так и хочется пошутить про потому что они ч. но не буду
30 окт 2017 в 7:34
Метод — это функция, которая член класса. И это вся разница вроде)
30 окт 2017 в 7:34
@andreymal можно как ответ делать. терминология-faq с эпичным ответом)
30 окт 2017 в 7:40
@АлексейШиманский я не уверен, что так во всех языках, и предпочту воздержаться от ответа. Эпичный ответ с примерами и исключениями (если таковые существуют) от кого-нибудь уверенного будет более полезным)
30 окт 2017 в 7:43
@andreymal А процедура — член класса тогда как называется?
30 окт 2017 в 8:25
6 ответов 6
Сортировка: Сброс на вариант по умолчанию
И чего так много слов то? Все просто:
Метод всегда является функцией, а функция не всегда является методом.
Отслеживать
ответ дан 30 окт 2017 в 9:12
81.1k 7 7 золотых знаков 72 72 серебряных знака 153 153 бронзовых знака
Это как «Большой палец — всегда палец, но палец не всегда большой?» (c) ТБВ
30 окт 2017 в 9:46
Точно, именно так 🙂
30 окт 2017 в 10:14
Нет единой устоявшейся техники наименования сущностей в языках программирования и каждый язык, чтобы немного отличаться от других, по историческим причинам имеет свой набор названий и соглашений.
Так как программирование пришло с математики, то начальные корни нужно искать там. А там были функции и процедуры. Функция на основании своих аргументов генерирует какой-то результат. sin , cos — яркие примеры. Функция без аргументов — вырожденный вариант и обычно это константа. В математике обычно функции являются чистыми — то есть, у них нет побочных эффектов. То есть, вызов функции с одними и теми же аргументами дает один и тот же результат.
Параллельно существуют процедуры. Процедура — это последовательность действий, приводящая к определенному результату (да, обычная программа — это также может быть процедура, хотя. ). В паскале и фортране принято, что процедура не возвращает результат. Но я считаю, что это исключительно соглашение, потому что иначе нужно было бы делать как в C/C++ и вводить пустой тип (void).
почему в Си++ члены не называют «методами»?
Во многих языках 60-70 годов не было ООП в том понимании, которое известно сейчас. С++ изначально был просто «фронтом» (то есть надстройкой) над обычным Си. Был долгий период, когда это уже был не Си, но и ещё и не C++. Компилятора C++ не было, а был транслятор в Си. Видимо, поэтому там закрепилось функция класса/переменная класса. Сейчас Страуструп предлагает N4174, и если его примут, то грань между обычными функциями и функциями класса размоется ещё больше.
В других языках — Java и семейство, проектировались, когда уже ООП был немного сформированным. От обычных функций они решили отказаться и, видимо, чтобы не вызывать путаницу, обозвали все методами. Да, потом им пришлось функции все-таки вернуть назад, но, чтобы ничего не сломать, назвали это статическими методами.
Собственно, какова разница между терминами «метод» и «функция»
Правильный ответ — историческая. Как правильно называть сущности в разных языках, нужно уточнять в их документации.
многие автора книг по с++ называют функции класса методами. Как быть?
Тут все сложно. Например, Эккель так делает видимо потому, что он ещё и много книг о Java написал. Также не стоит забывать, что многие книги мы читаем в переводе, а они «исправляют», потому что переводчику так понятнее.
так можно ли называть функции класса с++ методами?
Это точно так же, как использовать мат/обсценную лексику в высшем обществе. Или пытаться объясниться с гопниками языком Тургенева и стихами Пушкина/Блока.
P.S. метод — слово многозначное и вполне можно услышать от C++ программистов такое «это метод для получения данных с сервера, реализован в виде 5 функций и двух классов».