Форум » C/C++ » Задача на сообразительность: почему x * y не равно x.operator *( y )? » Ответить

Задача на сообразительность: почему x * y не равно x.operator *( y )?

Сыроежка: Этот забавный пример я встретил на одном форуме. Сам бы я до такого примера не додумался. на это способны только начинающие программисты. Так что кто хочет, как говорится, размяться, можете оставить здесь свой ответ на заданный вопрос. Итак, внимание, вопрос начинающего программиста знатокам! (Обозначения переменных и формулировка вопроса сохранены как в оригинале) [quote]В чем разница между двумя строками кода? [pre2] const MC* mc3 = mc1->operator*( mc2 ); const MC* mc4 = mc1 * mc2; [/pre2] Я думал, что они должны быть эквивалентны, но мой компилятор так не считает. Вторая строка генерирует сообщения об ошибках, тогда как первая строка компилируется компилятором без каких-либо замечаний.[/quote]

Ответов - 3

ололеша: были бы переменные не указателями - разницы бы не было. а так разница в том, что в первом случае явно вызывается перегруженный в классе оператор. неоднозначности нет. во втором ищется ПОДХОДЯЩАЯ функция. наш перегруженный оператор в классе не является подходящим, т.к первый операнд не должен быть указателем. чтобы эти строки были эквивалентны нужно написать const MC* mc4 = *mc1 * mc2;

Сыроежка: ололеша пишет: во втором ищется ПОДХОДЯЩАЯ функция. наш перегруженный оператор в классе не является подходящим, т.к первый операнд не должен быть указателем Это не совсем так, так как перегруженный оператор не обязан быть функцией-членом класса. Просто во-втором случае оба операнда - встроенные типы, то есть указатели, а для них нельзя переопределять операторы. То есть согласно параграфу № 6 раздела 13.5 Overloaded operators стандарта С++ 2011 6 An operator function shall either be a non-static member function or be a non-member function and have at least one parameter whose type is a class, a reference to a class, an enumeration, or a reference to an enumeration. Для указателей вообще не определен оператор умножения. А в остальном вы правы. Я думал, когда такое может понадобиться и придумал что-то вроде следующего примера, то есть когда объект создается только в куче. Конечно нужно было бы еще конструктор копирования сделать закрытым. [pre2]#include "stdafx.h" #include <iostream> class A { public: static A * create( int i = 0 ) { return ( new A( i ) ); } A * operator *( const A *a ) const { return ( new A( x * a->x ) ); } std::ostream & out( std::ostream &os ) const { return ( os << x ); } private: A( int i ) : x( i ) {} int x; }; std::ostream & operator <<( std::ostream &os, const A *a ) { return ( a->out( os ) ); } int _tmain(int argc, _TCHAR* argv[]) { const A *a1 = A::create( 10 ); const A *a2 = A::create( 2 ); const A *a3 = a1->operator*( a2 ); const A *a4 = *a1 * a2; std::cout << "a1 = " << a1 << ", a2 = " << a2 << ", a3 = " << a3 << ", a4 = " << a4 << std::endl; delete a1; delete a2; delete a3; delete a4; return 0; }[/pre2] Вот ссылка на исходный вопрос, где я его нашел.

ололеша : Это не совсем так, так как перегруженный оператор не обязан быть функцией-членом класса. я и не говорил, что он обязан. ищется подходящая функция (функция-член, обычная функция). для двух указателей нед подходящей функции, вот и все. то, что для двух указателей ее просто не может быть уже свойство самих указателей




полная версия страницы