2011-06-24 3 views
4

У меня есть сомнения, можем ли мы сделать следующее или нет.Перегрузка оператора на C++

Предположим, я создал два экземпляра класса A т.е. obj1 и obj2 и класс A имеет функцию члена show().

Могу ли я использовать следующее?

(obj1+obj2).show() 

Если да, то как? Если нет, то почему это невозможно?

+0

Какое поведение можно было бы ожидать от код? – sharptooth

+0

Вы спрашиваете, можете ли вы вызвать функцию-член в результате предыдущей операции (возможно, не понимая, что 'op +' есть вызов функции)? –

+0

Я просто хочу показать общее значение (т.е. obj1.x + obj2.x), используя метод show, не изменяя значение экземпляра с использованием вышеописанного метода ... – Abhineet

ответ

8

Да, это возможно, просто реализовать оператор + для 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; 
} 
+0

Спасибо за ваш совет. :) – Abhineet

2

Вы можете сделать это, если вы перегрузите оператор + таким образом, чтобы он принял два аргумента типа A и дал объект с методом с именем show.

2

Если obj1 + obj2 возвращает объект, имеющий элемент функции show(), тогда да, это возможно.

Если нет, это не так.

Таким образом, это зависит от используемой здесь функции operator +, которая зависит от обоих типов obj1 и obj2.

obj1 + obj2 - это выражение, которое имеет тип, тип объекта, возвращаемого операцией, как любое выражение. Теперь, когда выражение выполняется, у вас есть этот объект. Но поскольку здесь вы не связываете его с именем (например, с помощью присвоения), оно является «временным», то есть оно будет уничтожено в конце полного выражения.

Итак, если результирующий тип временного объекта предоставляет функцию show(), вы можете называть его так же, как и вы.

Если он не предоставляет функцию show(), вы пытаетесь вызвать функцию, которая не существует.

Так что в любом случае компилятор остановит вас, это не будет ошибкой во время выполнения.

Я был бы вами, я бы установил минимальный тестовый проект, чтобы играть с этими принципами.

+0

Почему это должно быть 'const'? Временным является ** не ** 'const'. [Посмотрите на это] (http://www.ideone.com/u4Z1t). Возможно, вы запутались, потому что вы не можете привязать временные разделы к 'refs-to-non-const' (это совершенно другая проблема). –

+0

"Если [+] возвращает объект [имеющий] константу show()" - это ограничение действует только в том случае, если 'operator +' возвращает объект 'const', что часто бывает разумным (в соответствии с C++ обычно не допускается, чтобы временные значения были lvalues), но необязательно. –

+0

Интересно, AFAIK это не должно ... Или, может быть, это из-за оптимизации (inlining)? Как указано оператором +, возвращаемый объект является временным, поэтому его нельзя модифицировать. show is not const, поэтому его нельзя указывать там ... – Klaim

0

В зависимости от типа результата obj1+obj2 есть ли .show() - это постоянный метод.

+1

['show()' не обязательно 'const'.] (Http://stackoverflow.com/questions/6466253/if-temporaries-are-implicitly-const-how -does-this-work/6466316 # 6466316) –

1

Напишите операторную перегрузку для оператора + и определите требуемую операцию.

В перегрузкой оператора для оператора + просто обновить логику вы хотите, как добавить отдельные переменные-член или конкатенации имен и т.д. осмысленно на основе вашего случая использования

Тогда вы можете назвать это новое object.Show функции() как функция вызова объекта-объекта.

2

Да, вы можете использовать его, если вы перегрузили оператора + из class A, чтобы вернуть объект class A.

-2

Нет! Результат (obj1 + obj2) не является объектом.Вы можете перегрузить «=» и использование:

obj3 = obj1 + obj2; 
obj3.show(); 
+1

Почему бы и нет? Если вы можете написать 'obj3 = obj1 + obj2', тогда делайте материал с' obj3', тогда вы можете абсолютно написать '(obj1 + obj2) .show()'. –

Смежные вопросы