![]() |
|
Модераторы: bsa |
![]()
|
|
| GrafF812 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
Привет, есть такой вызов функции square()
Подскажите почему при вызове функции square(7), вызывается версия square(double) а не генерируется сообщение об ошибки? |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Потому что int преобразуется в double.
-------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| GrafF812 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 205 Регистрация: 3.12.2009 Репутация: нет Всего: нет |
djamshud, в чем тогда смысл перегрузки функций ?, если все равно происходит неявное преобразование типов, как в этом случае.
|
|||
|
||||
| djamshud |
|
||||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
В том, чтобы можно было сделать так:
В вашем случае вы можете указать разную логику для работы над int и над double, т.к. преобразование типов включается после того, как не нашлось прямого действия. Добавлено через 5 минут и 42 секунды ну или вот пример из моей недавней практики:
Одна логика для работы со строкой и совершенно другая - для любых других указателей. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
||||
|
|||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
mes, я вообще очень суров
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Здесь имеет место так называемое продвижение. int неявно преобразуется к double, но не наоборот.
Когда вызывается функция, происходит поиск её имени. Здесь нет ползовательских (user-defined) типов (проще говоря, классов или енумов), поэтому ADL не выполняется. Выбирается та функция, которая подходит лучше всего, т.е. та, для вызова которой надо сделать как можно меншьше допустимых приведений. Если в этой цепочке присутствуют приведения типа определённые пользователем, (не explicit конструкторы классов или всевозможные operator T()), то допускается не более одного.
Это сообщение отредактировал(а) Леопольд - 31.8.2010, 20:51 -------------------- вопросов больше чем ответов |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
codepad.org
Добавлено @ 20:59 Здесь речь про "продвижение" встроенных типов, оно идёт в одном напрвалении: char -> short -> int -> long -> float -> double . Здесь я "опустил" unsigned типы. Это сообщение отредактировал(а) Леопольд - 31.8.2010, 21:03 -------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 3 Всего: 13 |
Я точно уже не помню. Лазить выскивать точную инфу нет времени...
Это сообщение отредактировал(а) Леопольд - 1.9.2010, 08:58 -------------------- вопросов больше чем ответов |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
в С++ компилятор осуществляет неявное (implicit) преобразование типов во время разбора выражений. эта некоторая слабость типизации есть дань совместимости с С и для опытных программистов довольно удобна, хотя иногда приводит к трудноуловимым ошибкам.
Правила преобразования (почти всегда) интуитивно понятны, хотя и не настолько просты, что бы выразить их одной строчкой. Для избежания неявного преобразования есть два механизма - явное приведение типов _cast, (type), type() и ключевое слово explicit, применимое, к сожалению, лишь в конструкторах. Замечу, что первое - явное преобразование - не защищает от неявного:
используя перегрузку функций можно специализировать функцию для определенного типа http://codepad.org/jJ7DkWBy, компилятор будет применять функцию, наиболее близкую по типу параметров, однако неявное преобразование это не отменяет |
|||
|
||||
| ИванМ |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1260 Регистрация: 19.6.2006 Где: СПб Репутация: 3 Всего: 23 |
Леопольд, а как называется неявное преобразование double к int?
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
тогда поправлю:
тут нет никакого продвижения Floating-integral conversions
|
||||
|
|||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |