Функция похожа на статический метод? - PullRequest
7 голосов
/ 07 мая 2010

Я программист на Java и пытаюсь понять разницу между методом (методы java) и функцией (например, в c ++). Раньше я думал, что это одно и то же, просто разные соглашения об именах для разных языков программирования. Но теперь, когда я знаю, что это не так, мне трудно понять разницу.

Я знаю, что метод относится к экземпляру класса и имеет доступ к данным класса (переменным-членам), а функция - нет (?). Так что, функция похожа на статический метод?

См. здесь для объяснений, которые я прочитал, которые заставили меня подумать об этом.

Ответы [ 5 ]

4 голосов
/ 07 мая 2010

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

Функции Java и C ++ по большей части абсолютно одинаковы.

Слово "метод" имеет тенденцию использоваться для подпрограмм, связанных с экземпляром, в то время как "функция" имеет тенденцию использоваться для тех, которые являются глобальными / статическими.

Но даже тогда "методы" генерируются компилятором, как если бы они были "функциями".

Рассмотрим этот код C ++:

class Foo
{
public:
    void DoFoo(int param)
    {
        printf("%d, %d\n", param, member);
    }
private:
    int member;
};

int main()
{
    Foo f;
    f.DoFoo(42);
    return 0;
}

Компилятор генерирует код, эквивалентный следующему:

struct Foo
{
    int member;
};

void Foo_DoFoo(Foo* this, int param)
{
    printf("%d, %d\n", param, this->member);
}

int main()
{
    Foo f;
    Foo_DoFoo(&f, 42);
    return 0;
}

Таким образом, различие между «методом» и «функцией» является всего лишь соглашением.

2 голосов
/ 07 мая 2010

Это строго словарный запас. Некоторые рассматривают метод как операцию, которая принадлежит объекту или классу, а функцию - как операцию, которая этого не делает. Другие, такие как толпа C ++, вызывают их обе функции, но ссылаются на свободные функции или функции, не являющиеся членами , когда функция не принадлежит ни классу, ни объекту. Я лично использую два взаимозаменяемо.

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

1 голос
/ 07 мая 2010

В C все «функции» являются «верхним уровнем» в том смысле, что они не были связаны с типом. Если бы они были в вашей области (например, через включение), вы могли бы сослаться на них, и они могли бы быть связаны.

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

В Java каждый метод связан с классом, поэтому существуют статические методы, но нет функций в стиле C.

0 голосов
/ 08 мая 2010

Эта функция похожа на статический метод?

Вид.Но я бы скорее сказал, что статический метод подобен функции, которая была порабощена и скована к объекту .Для уточнения этой точки зрения см. Казнь в Царстве Существительных .

0 голосов
/ 07 мая 2010

Проще говоря, функция - это то же самое, что статический метод Java, однако функция не требует наличия класса, что превращает его, как говорит Ури, в кусок кода верхнего уровня.Одним из преимуществ этого является то, что он не потребует вызова экземпляра объекта.

...