Перегрузка операторов в C++
У меня есть сомнения, можем ли мы сделать следующее или нет.
Предположим, я создал два экземпляра класса A
т.е. obj1
а также obj2
и класс A
имеет функцию-член show()
,
Могу ли я использовать следующее?
(obj1+obj2).show()
Если да, то как? Если нет, то почему это невозможно?
7 ответов
Да, это возможно, просто реализуйте оператор + для A и пусть он возвращает класс типа A:
#include <iostream>
class A
{
public:
explicit A(int v) : value(v) {}
void show() const { std::cout << value << '\n'; }
int value;
};
A operator+(const A& lhs, const A& rhs)
{
A result( lhs.value + rhs.value );
return result;
}
int main()
{
A a(1);
A b(1);
(a+b).show(); // prints 2!
return 0;
}
Вы можете сделать это, если вы перегружаете +
оператор таким образом, что он принимает два аргумента типа A
и дает объект, который имеет метод с именем show
,
Да, вы можете использовать его, если вы перегружены +
оператор class A
вернуть объект class A
,
Если obj1+obj2 действительно возвращает объект, который имеет член функции show(), то да, это возможно.
Если нет, то это не так.
Таким образом, это зависит от используемой здесь функции оператор +, которая зависит от обоих типов obj1 и obj2.
obj1+obj2 - это выражение, которое имеет тип, тип объекта, возвращаемого операцией, как любое выражение. Теперь, когда выражение выполнено, у вас есть этот объект. Но поскольку здесь вы не связываете его с именем (например, с помощью присваивания), оно является "временным", то есть оно будет уничтожено в конце полного выражения.
Таким образом, если тип результирующего временного объекта предоставляет функцию show(), вы можете вызывать ее, как и раньше.
Если он не предоставляет функцию show(), то вы пытаетесь вызвать функцию, которая не существует.
Так что в любом случае компилятор остановит вас, это не будет ошибкой во время выполнения.
Я был бы вами, я бы настроил минимальный тестовый проект, чтобы поиграть с этими принципами.
Напишите перегрузку оператора для оператора + и определите требуемую операцию для этого.
В перегрузке оператора для оператора + просто обновите логику, которую вы хотите, например, добавление отдельных переменных-членов или объединение имен и т. Д., В зависимости от вашего варианта использования.
Затем вы можете вызвать эту новую функцию object.Show() так же, как объект, вызывающий функцию-член.
Зависит от того, какой тип результата obj1+obj2
есть ли .show()
постоянный метод.
Нет! Результат (obj1+obj2) не является объектом. Вы можете перегрузить "=" и использовать:
obj3 = obj1 + obj2;
obj3.show();