Разница между оператором и функцией в С++?

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

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

Ответ 1

Оператор представляет собой символ типа +, -, += и т.д. (см. 13.5). Они не имеют никакого значения. При семантическом анализе определяется значение оператора.

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

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

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Edit:

Чтобы показать, что оператор в определенном пользователем классе ведет себя точно так же, как функции, приведен пример использования 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

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

Ответ 4

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

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

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

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

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

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

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

Ни. Это пользовательская перегрузка оператора. Имя функции не может начинаться с ключевого слова operator, а оператор - это просто фактический знак препинания, используемый для вызова перегрузки оператора, то есть + или -. EDIT: Обратите внимание, что, хотя технически это не функция, у нее есть семантика вызова функции, как показано в @Martin York отличный ответ.

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

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

Ответ 5

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

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

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

EDIT: см. также http://en.wikipedia.org/wiki/Operator_overloading и http://en.wikibooks.org/wiki/C++_Programming/Operators/Operator_Overloading

Ответ 6

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

Таким образом, чтобы ответить на несколько ваших конкретных вопросов:

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

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

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

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

Ответ 7

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

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

Ответ 8

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

  • Оператор не выводит свои параметры в стек, но функция подталкивает его параметры в стек.

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