2017-01-31 38 views
-2

У нас есть класс (предполагая, что есть некоторые операции в функциях, но конструктор по умолчанию):C++: Как работает членский двоичный оператор?

class X 
{ 
public: 
    X& operator=(const X& rhs){} 
    const X& operator+(const X& rhs) const {} 
    const X& operator+(int m) {} 
}; 
X a, b, c; 

Q1: Почему a = a + 5 + c; разрешено и a = b + c + 5; нет? Мы имеем:

Ошибка C2679 двоичные «+»: ни один оператор не найден, который принимает правый операнд «Int» типа (или нет приемлемого преобразования).

Q2: Почему (c = a + a) = b + c; начинается с Ь + операции с и не с + а? (Я нашел это во время отладки).

P.S. Это только теоретический вопрос.

+0

'(c = a + a) = b + c;' - неопределенное поведение, когда вы читаете и записываете одну и ту же переменную в одной точке последовательности. – NathanOliver

+1

offtopic: почему ваш 'operator +' возвращает '&'? Я нашел отличный пример перегрузки операторов в этом [ответе] (http://stackoverflow.com/questions/4421706/operator-overloading/4421719#4421719) –

+0

@NathanOliver, в Visual Studio он, по крайней мере, отлично работает. Вопрос в том, почему такой порядок? – Archont

ответ

1

Почему a = a + 5 + c; разрешено и a = b + c + 5; не является?

Const X & оператор + (интермедиат м) {} не является константной, а возврат от + операторов Const X. Сделать это константная функция, и она будет работать нормально; (кроме возврата ссылки после этой операции очень странно)

+0

Я пробовал, и это действительно работает! Я все еще не понимаю ... Как заставить функцию const влиять на вызов оператора? – Archont

+1

'const X & operator + (int m) {}' эта функция говорит о том, что она изменит X, на котором он будет работать - это означает, что это невозможно сделать для объекта const. 'const X & operator + (const X & rhs) const {}' эта функция говорит, что она вернет const X & – UKMonkey

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

  • Нет связанных вопросов^_^