On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 19:28. Заголовок: Задача на сообразительность: почему x * y не равно x.operator *( y )?


Этот забавный пример я встретил на одном форуме. Сам бы я до такого примера не додумался. на это способны только начинающие программисты.
Так что кто хочет, как говорится, размяться, можете оставить здесь свой ответ на заданный вопрос.
Итак, внимание, вопрос начинающего программиста знатокам!
(Обозначения переменных и формулировка вопроса сохранены как в оригинале)


 цитата:
В чем разница между двумя строками кода?

 const MC* mc3 = mc1->operator*( mc2 ); 	 
const MC* mc4 = mc1 * mc2;




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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 3 [только новые]





ссылка на сообщение  Отправлено: 28.07.12 19:30. Заголовок: были бы переменные н..


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

 цитата:

const MC* mc4 = *mc1 * mc2;



Спасибо: 0 
Цитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 19:31. Заголовок: ололеша пишет: во в..


ололеша пишет:

 цитата:
во втором ищется ПОДХОДЯЩАЯ функция. наш перегруженный оператор в классе не является подходящим, т.к первый операнд не должен быть указателем



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

То есть согласно параграфу № 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.



Для указателей вообще не определен оператор умножения.

А в остальном вы правы.

Я думал, когда такое может понадобиться и придумал что-то вроде следующего примера, то есть когда объект создается только в куче. Конечно нужно было бы еще конструктор копирования сделать закрытым.

#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;
}


Вот ссылка на исходный вопрос, где я его нашел.

Спасибо: 0 
ПрофильЦитата Ответить



ссылка на сообщение  Отправлено: 28.07.12 19:32. Заголовок: Это не совсем так, ..



 цитата:

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


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

Спасибо: 0 
Цитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 4
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет