Разница между перегрузкой функций и перегрузкой методов - PullRequest
2 голосов
/ 10 марта 2012

Привет, я пытаюсь понять разницу между перегрузкой функций и перегрузкой методов в c ++. После поиска в Google я столкнулся с этим. не уверен, что это правильно. Если неправильно, пожалуйста, помогите в исправлении.

Перегрузка метода и перегрузка функций - связанные понятия. Термин перегрузка метода определяется как функция, которая встречается в различных языках программирования, таких как C ++ и Java. Это позволяет создавать различные функции с одинаковым именем. Однако все эти функции отличаются друг от друга с точки зрения типа входа и типа выхода функции.

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

Источник: http://www.blurtit.com/q662319.html

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

В C ++ Метод обычно используется для ссылки на функцию-член для класса или структуры, в то время как
Функция является автономной функцией, не являющейся членом.


Как стандарт объявляет функцию и метод?

Согласно стандарту C ++, объявление функции определяется в: 8.3.5Функции [dcl.fct]

В объявлении T D, где D имеет форму

D1 ( parameter-declaration-clause ) cv-qualifier-seqopt exception-specificationopt

и тип contained declarator-id вобъявление T D1 равно «производный-декларатор-тип-список-T», тип идентификатора объявления в D равно «производная-декларатор-тип-список-функция из (parameter-declaration-clause) cv-qualifier-seqopt возврат T ”;тип этой формы - функция типа 86).

Обратите внимание, что в стандарте далее указывается в # 4:

A cv-qualifier-seq должно быть только частьютипа функции для нестатической функции-члена

Для суммирования только методы (функции-члены) могут быть const или volatile.


Критерии перегрузки для функции и перегрузки метода:

Таким образом, перегрузка функции и перегрузка метода (функции-члена) имеют разные критерии

Перегрузка функции возможна тогда и только тогда, когда:

  • Разное количество аргументов.
  • Другая последовательность аргументов или
  • Различные аргументы

Метод while (функция-член) Перегрузка возможна тогда и только тогда, когда:

  • Разное количество аргументов.
  • Другая последовательность аргументов или
  • Различные аргументы или
  • Разное cv-qualifer-seq

Обратите внимание, что тип возвращаемого значения не является критерием перегрузки.Поскольку C ++ позволяет реализациям игнорировать возвращаемое значение из функций / методов.


Примеры кода:

Перегрузка функции:

void doSomething(int i);
void doSomething(std::string,int x);

Перегрузка метода:

class Myclass
{
     public:
           void doSomething(int i);
           void doSomething(std::string,int x);
           void doSomething(int i) const;
           void doSomething(int i) volatile;
};

Выше приведен пример того, как doSomething() может быть перегружен как автономная функция и как метод / функция-член.

2 голосов
/ 10 марта 2012

Это одно и то же.

Однако некоторые предпочитают вызывать методы функций, которые являются частью class, и функции, свободные функции.

//function overloading
void foo(int x);
void foo(int x, int y);

//method overloading
class A
{
   void foo(int x);
   void foo(int x, int y);
};

Метод / функция перегружены, изменяя подпись, но сохраняя ее имя. Подпись состоит из:

  • имя
  • типы параметров
  • CV-определители

Итак, для перегрузки вам нужно только изменить параметры или cv-квалификаторы. То есть если метод является частью класса, вы также можете перегрузить его так:

class A
{
   void foo(int x);
   void foo(int x) const;
   void foo(int x, int y);
};

Прототип foo(int x) const будет вызываться при работе с неизменным объектом.

0 голосов
/ 10 марта 2012

В общем смысле функции возвращают значения.Методы просто делают действия.

Пример учебника, который вы увидите много, - door.open() и hood.open() (да, мы все ненавидим ужасную машину -> аналогии ОО, но этопонятно в этом случае).Это методы.Вы открываете дверь, и нет побочного продукта.Но это сводится к , как дверь должна быть открыта, по сравнению с тем, как открывается капот;они достаточно похожи, чтобы разделить действие, но отличаются детальной реализацией (которую вы по праву хотели бы скрыть от пользователя ... двери открываются из , а вытяжки открываются вверх ).

Однако функции заменяют исходный вызов функции значением, возвращаемым функцией.Если я правильно понимаю, вы можете показать это, измерив car.exhaust(30, 0), который возвращает вес углерода, кислорода и других газов, испущенных за 30 секунд, при скорости 0 миль в час.Однако функция car.exhaust(30, 60) будет включать детали, не используемые с переменной speed, равной 0, и соответствующим образом изменит выход.

Существует множество примеров перегрузки функций, этот просто демонстрирует, как разные параметрыможет влиять на логику и вывод используемой функции.

...