Разница между оператором и функцией в C ++? - PullRequest
13 голосов
/ 16 января 2011

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

  • Что такое оператор?
  • Что такое функция?
  • В чем разница между ними?
  • Определяемая пользователем operator+() функция или оператор ?
  • Может ли оператор работать с операндами во время компиляции? Они всегда работают во время компиляции? (как sizeof() в C ++)

Ответы [ 8 ]

10 голосов
/ 17 января 2011

Оператор - это символ типа +, -, += и т. Д. (См. 13.5).Они не несут смысла.Во время семантического анализа определяется значение оператора.

Функция - это конструктор, деструктор, функция преобразования (которая выглядит как operator type()) или операторная функция (специализация и создание экземпляра шаблона функции могут привести к ним по очереди).

операторная функция - это то, что реализует оператор (см. 13.5).Примером является operator+.Это функции во всех отношениях, и единственное отличие от «обычных» функций заключается в том, что они могут быть вызваны неявно и имеют забавное имя.

Некоторые операторы имеют встроенное значение, которое может изменить программист.Один относится к встроенному значению оператора, просто сказав встроенный оператор (см. 5/3).Однако, если такой оператор применяется к операндам, для которых определено встроенное значение, изменение этого значения допускается только в нескольких случаях (это оператор присваивания, адреса и запятой, см. 13.5 / 6).

6 голосов
/ 16 января 2011

Что такое оператор?

Оператор - это символ, который используется в выражениях.
Примеры: + - * / etc

Встроенный-в типах там операции хорошо определены и неизменны.
Для пользовательских типов операторы могут быть определены как синтаксический сахар для вызова функции / метода

Array a;
a = b + c; // a.operator=(b.operator+(c));

Что такое функция?

Мы используем термин функция / метод взаимозаменяемо большую часть времени.Единственное отличие состоит в том, что метод связан с экземпляром объекта класса.В остальном они одинаковые.Они обеспечивают способ группировки набора инструкций.

В чем разница между ними?

Определяется действие оператора для встроенного типакомпилятором.
Действие оператора над пользовательским типом - это вызов функции.

Является ли пользовательский оператор + () функцией или оператором?

Это функция (или метод).Использование оператора для определенного пользователем типа является синтаксическим сахаром для вызова функции.Они по-прежнему называются операторами в обычном диалоге.

Может ли оператор работать с операндами во время компиляции?

Для встроенных типов да.Компилятор имеет широкие возможности для оптимизации их использования.
Для пользовательских типов.Он может выполнять оптимизацию операторов так же, как и другие функции, что может привести к их удалению, но код не выполняется во время компиляции.

Всегда ли они работают во время компиляции?(например, sizeof () в C ++)

Нет.sizeof () относительно уникален.

Редактировать:

Чтобы показать, что оператор в пользовательском классе ведет себя так же, как функции, это пример использования mem_fun_ref

#include <vector>
#include <algorithm>
#include <memory>
#include <functional>

class X
{
    public:
        // Non standard operators.
        // Because std::mem_fun_ref has a known weakness in that it can
        // not be used with methods that take parameters be reference.
        //
        // The principle is the same though. That the operator+ can be
        // used anywhere that the add() method can be used.

        X& operator+(X* rhs)  { return *this;}
        X& add(X* rhs)        { return *this;}
};

typedef X& (X::*MEMF)(X* rhs);

int main()
{
    MEMF    p1  = &X::add;
    MEMF    p2  = &X::operator+;

    X               value;
    std::vector<X>  data;

    std::for_each(data.begin(),
                  data.end(),
                  std::bind2nd(std::mem_fun_ref(&X::operator+),&value));
}
3 голосов
/ 16 января 2011

Нет существенной разницы между операторами и функциями, за исключением того, что операторы имеют другой синтаксис.Однако примитивные операторы не являются функциями.

2 голосов
/ 16 января 2011

Что такое оператор?

Оператор , как правило, представляет собой операцию, выполняемую над переменной с некоторой формой пунктуации.Например, поведение по умолчанию operator+ между двумя целыми числами заключается в добавлении их.

Что такое функция?

A Функция являетсяПодпрограмма - повторно используемый блок кода.

В чем разница между ними?

Ничего, что касается кода пользователя, кроме синтаксиса.Обратите внимание, что если вы переопределите operator||, operator&& или (в меньшей степени) operator,, вы измените семантику встроенной семантики операторов.В случае && и || вы выполняете операцию, которая обычно является коротким замыканием, в операцию, которой нет.В случае запятой вам нужно убедиться, что вы оцениваете аргументы слева направо, поскольку оператор запятой обычно ведет себя таким образом.

Является ли пользовательский оператор + () функцией илиоператор?

Ни того, ни другого.Это определенная пользователем перегрузка оператора.Имя функции не может начинаться с ключевого слова operator, а оператор - это просто фактический знак пунктуации, используемый для вызова перегрузки оператора, т. Е. + или -. РЕДАКТИРОВАТЬ: Обратите внимание, что, хотя технически это не функция, она имеет семантику вызова функции, как показано в @ превосходный ответ Мартина Йорка .

Может ли оператор работать с операндами во время компиляции?Они всегда работают во время компиляции?(например, sizeof () в C ++)

Нет, sizeof не может быть перегружен.Если вы хотите, чтобы выполнялась какая-либо форма операции времени компиляции, вам нужно использовать что-то вроде template metaprogramming .Обратите внимание, что если компилятор может выполнять вычисления во время компиляции, он, конечно, может перевести вызов в ваш перегруженный оператор.

0 голосов
/ 17 мая 2012

Вот некоторые различия между оператором и функцией:

  1. Оператор не помещает свои параметры в стек, но функция помещает свои параметры в стек.

  2. Компилятор знает о работе операторов, но не знает о выводе функции. Иными словами, действие оператора определяется во время компиляции, а действие функции определяется во время выполнения.

0 голосов
/ 16 января 2011

Между функциями и операторами есть только два небольших различия.

  1. Операторы могут использоваться двумя способами (x+y или operator+(a,b)).
  2. Операторы должны иметь то же количество параметров, что и встроенный (operator== должно иметь ровно два параметра). Исключением из этого правила является вызов функции operator(), который может быть перегружен любым количеством любых параметров.
0 голосов
/ 16 января 2011

Нет большой разницы между функциями и операторами.Вы можете думать об операторе использования, например, «a + b», как о ярлыке к оператору функции + (a, b), который определен для типов a и b.Конечно, операторы примитивных типов (например, целых чисел) и некоторых других исключений не обязательно определяются следующим образом.

Таким образом, чтобы ответить на несколько ваших конкретных вопросов:определенный пользователем оператор + () функция или оператор?

Функция, которая реализует оператор.

Может ли оператор работать с операндами во время компиляции?Они всегда работают во время компиляции?

Поскольку это функция, она работает во время выполнения, но в некоторых случаях оптимизация компилятора может выполнять работу во время компиляции для определенных операторов.Я не уверен на 100%, почему вы спрашиваете об этом, поэтому, возможно, здесь есть кое-что, о чем я не знаю.

0 голосов
/ 16 января 2011

В C ++ вы можете переопределить действия символов +, -, == и т. Д. При применении к экземплярам классов. Определяя метод operator + в классе A, вы сообщаете компилятору, что делать с кодом, подобным следующему:

A a, b, c;
c = a + b; // the + here actually calls a.operator+(b)

Это также функция или, точнее, метод экземпляра, в том смысле, что это то, что вызывается.

РЕДАКТИРОВАТЬ: см. Также http://en.wikipedia.org/wiki/Operator_overloading и http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading

...