Перегрузка операторов в 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();
Другие вопросы по тегам