Разница между оператором и функцией в С++?
Я мог бы использовать некоторую помощь, чтобы понять следующее на С++, в частности разницу между оператором и функцией:
- Что такое оператор?
- Что такое функция?
- В чем разница между ними?
- Является ли пользовательская функция
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
Вот некоторые отличия между оператором и функцией:
-
Оператор не выводит свои параметры в стек, но функция подталкивает его параметры в стек.
-
Компилятор знает о работе операторов, но не знает о выходе функции. С другой стороны, действие оператора определяется во время компиляции, а функция определена во время выполнения.