| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > перегрузка функций и приведение типов |
| Автор: GrafF812 31.8.2010, 10:55 | ||
Привет, есть такой вызов функции square()
Подскажите почему при вызове функции square(7), вызывается версия square(double) а не генерируется сообщение об ошибки? |
| Автор: djamshud 31.8.2010, 11:09 |
| Потому что int преобразуется в double. |
| Автор: GrafF812 31.8.2010, 11:35 |
| djamshud, в чем тогда смысл перегрузки функций ?, если все равно происходит неявное преобразование типов, как в этом случае. |
| Автор: djamshud 31.8.2010, 11:40 | ||||
В том, чтобы можно было сделать так:
В вашем случае вы можете указать разную логику для работы над int и над double, т.к. преобразование типов включается после того, как не нашлось прямого действия. Добавлено через 5 минут и 42 секунды ну или вот пример из моей недавней практики:
Одна логика для работы со строкой и совершенно другая - для любых других указателей. |
| Автор: ИванМ 31.8.2010, 15:52 |
В вашем коде никакой перегрузки функций и нет. Если раскомментировать первую строчку, то как раз перегрузка произойдет. Неявное преобразование типа происходит, только если нет перегрузки. |
| Автор: mes 31.8.2010, 18:14 | ||
звучит резковато |
| Автор: ИванМ 31.8.2010, 20:29 |
| mes, я вообще очень суров |
| Автор: Леопольд 31.8.2010, 20:45 | ||
| Здесь имеет место так называемое продвижение. int неявно преобразуется к double, но не наоборот. Когда вызывается функция, происходит поиск её имени. Здесь нет ползовательских (user-defined) типов (проще говоря, классов или енумов), поэтому ADL не выполняется. Выбирается та функция, которая подходит лучше всего, т.е. та, для вызова которой надо сделать как можно меншьше допустимых приведений. Если в этой цепочке присутствуют приведения типа определённые пользователем, (не explicit конструкторы классов или всевозможные operator T()), то допускается не более одного.
|
| Автор: ИванМ 31.8.2010, 20:57 |
Вот в этом месте не понятно. Вы имеете ввиду конкретный случай или вообще. |
| Автор: Леопольд 31.8.2010, 20:57 | ||
http://codepad.org/TgHD3o6O
Добавлено @ 20:59 Здесь речь про "продвижение" встроенных типов, оно идёт в одном напрвалении: char -> short -> int -> long -> float -> double . Здесь я "опустил" unsigned типы. |
| Автор: mes 1.9.2010, 00:13 | ||
все в одну бочку ?! |
| Автор: Леопольд 1.9.2010, 08:43 |
| Я точно уже не помню. Лазить выскивать точную инфу нет времени... |
| Автор: baldina 1.9.2010, 09:23 | ||
| в С++ компилятор осуществляет неявное (implicit) преобразование типов во время разбора выражений. эта некоторая слабость типизации есть дань совместимости с С и для опытных программистов довольно удобна, хотя иногда приводит к трудноуловимым ошибкам. Правила преобразования (почти всегда) интуитивно понятны, хотя и не настолько просты, что бы выразить их одной строчкой. Для избежания неявного преобразования есть два механизма - явное приведение типов _cast, (type), type() и ключевое слово explicit, применимое, к сожалению, лишь в конструкторах. Замечу, что первое - явное преобразование - не защищает от неявного:
используя перегрузку функций можно специализировать функцию для определенного типа http://codepad.org/jJ7DkWBy, компилятор будет применять функцию, наиболее близкую по типу параметров, однако неявное преобразование это не отменяет |
| Автор: ИванМ 1.9.2010, 13:29 |
| Леопольд, а как называется неявное преобразование double к int? |