LINUX.ORG.RU

вопрос C++ девелоперам


0

0

волею случая пришлось вернуться - к счастью ненадолго - к уже немного подзабытым плюсам. дьявол с ним, что пришлось переодически листать стауструпа в течение разработки библиотеки, дабы вспомнить основные тонкости языка. признаться, после долгой разработки на других языках я отвык от такого кл-ва тонкостей и подводных камней, даже при реализации математической библиотеки предпочитя избежать многочисленных нюансов перегрузки операторов, копирующих кострукторов, неявных приведений типов и прочих "радостей жизни". открестился explicit'ами, методами типа obj.Division, obj.PowerOf, Obj.Subtr, etc. а вопрос в следующем: кто-нибудь из вас вообще использует перегрузку операторов(не считая new, delete и ->) и мн-во конструкторов для приведения заданного типа к иному или всё же для вас предпочтительнее избежать первое явными методами в стиле obj.Div, obj.Suvtr, etc, а второе - obj.ToInt, obj.ToDouble, etc? желательно увидеть аргументацию. спасибо.


чем бы дитя не тешилось, лишь бы бабло приносило

dilmah ★★★★★
()

конструкторы и операторы копирования, это само собой разумеется. Т.е. они либо должны быть правильные неявные, либо должны быть явно запрещены, либо должны быть правильные явные.

перегрузку обычных операторов стоит использовать в случае когда соответствующая операция интуитивно понятна читателю кода, вроде сложения векторов или конкатенации строк.

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

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

Кстати про new\delete не понял, имхо их перегружают как раз довольно редко.

При этом делать из С++ недоджаву сознательно не используя кучу удобных фич, имхо неправильно.

Legioner ★★★★★
()
Ответ на: комментарий от execve

> Да.

Это замечательный ответ на вопрос вида "делаете Вы так или эдак", сопровождаемый просьбой привести аргументацию ;)

anonymous
()

Если мы говорим про математику, то нам важна в первую очередь скорость. В этой связи перегруженные операторы должны писаться на expression templates, иначе постоянные копирования ответа из одного оератора в другой убьют всю скорость. Альтернатива -- явные функции на каждое выражение, используемое в вычислениях. В нашем софте мы тспользуем второе по разным причинам.

-- Разработчик математической библиотеки

yz
()
Ответ на: комментарий от yz

>иначе постоянные копирования ответа из одного оератора в другой убьют всю скорость

в чем проблема? используйте конструкции с move semantic. главная идея ET несколько в другом, а именно:

пусть A, B, C, D - матрици MxN, тогда

A = B + C + D

без ET потребуется два двойных цикла "for" (по строкам и по столбцам): dummy = B+C - двойной цикл и dummy + D - еще один двойной цикл. с ET потребуется только один двойной цикл, а если не все элементы A используются, то и того меньше. по сути ET - это lazy calclation.

aydef
()
Ответ на: комментарий от aydef

Что-то google про move semantic мало что знает... То, что удалось найти не компилируется. Можно где-нибудь подробнее про это почитать?

yz
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.