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

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

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

8 ответов


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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

нет. 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));
}

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


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

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

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

A функции подпрограмма -- в многоразовых блок кода.

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

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

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

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

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

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


В C++ вы можете переопределить то, что символы +, -, = = и т. д. do при применении к экземплярам класса. Определяя метод "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++_программирование / операторы / Operator_Overloading


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

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

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

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

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

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


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

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

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

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

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