|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.05.2011, 12:11 | #1 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Приведение/преобразование типов
Добрый день! Задумался вот над таким вопросом, а какая разница в следующих записях:
Код:
Спасибо. |
29.05.2011, 12:31 | #2 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Код:
Цитата:
Цитата:
в данном случае смысл один и тот же, правильнее последнее(в моем порядке, то есть статик_каст), так как позволяет контролировать тип приведения типов. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
29.05.2011, 13:10 | #3 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
кстати, преобразование типов совсем другое, в приведению не относится
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
29.05.2011, 18:56 | #4 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Спасибо за ответы, и сразу же появились новые вопросы:
В данном случае да, я заметил, а в каких ситуациях всё же будет разница между приведением в стиле С и приведением в стиле функции (статик каст не беру, т.к. вы уже отметили отличие)? В учебнике нашёл что-то типа: Существует две формы: каноническая и функциональная: 1) (имя_типа) операнд 2) имя_типа (операнд) Но какая разница, и в каких случаях использовать одно, а в каких другое - ни слова не сказано. Что же тогда правильнее назвать "преобразованием". Термины немного путаю, думал что это скорее всего синонимы. Поясните, пожалуйста. |
29.05.2011, 19:02 | #5 |
C++ hater
СтарожилДжуниор
Регистрация: 19.07.2009
Сообщений: 3,333
|
2rommster
приведения - это касты преобразования - это специальные операторы, объявленные в классе для преобразования
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay
My other car is cdr. Q: Whats the object-oriented way to become wealthy? A: Inheritance |
29.05.2011, 19:21 | #6 |
Форумчанин
Регистрация: 02.02.2010
Сообщений: 599
|
Первое - это C'шное приведение, как уже было сказано; второе - явный вызов конструктора, для фундаментальных типов они ничем не отличаются, для типов, определенных пользователем, отличия существенные.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
|
30.05.2011, 00:52 | #7 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
ТС, все очень просто. Если вы программируете на C++, то просто не используйте ничего, кроме следующих вариантов:
static_cast<T> - приводит тип к заданному на этапе компиляции программы. Компилятор проверит правильность привидения, и в случаи ошибки программа не скомпилируется dynamic_cast<T> - приводит тип к заданному на этапе выполнения программы. В случаи неправильного приведения возвращается нулевой указатель, либо генерируется исключение reinterpret_cast<T> - наиболее опасный способ приведения типа. Корректность приведения типа не проверяется вообще, и в случаи не правильного использования может привести к непредсказуемым последствиям. Вообще все эти приведения типов играют роль только при использовании с объектами классов, привидение базовых типов встречается очень редко, и как правило не играет никакой роли, какой из трех вариантов использовать. Но в любом случаи, использование большого количества приведений типов в программе, говорит о том, что она плохо спроектирована. Приведений типов следует избегать или пользоваться ими как можно реже.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
30.05.2011, 06:42 | #8 |
Пользователь
Регистрация: 05.10.2010
Сообщений: 46
|
Всем спасибо за полезную информацию, постараюсь разобраться.
|
30.05.2011, 14:37 | #9 | |
Форумчанин
Регистрация: 02.02.2010
Сообщений: 599
|
Цитата:
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
|
|
30.05.2011, 14:44 | #10 |
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
|
const_cast<T> немного не из той оперы, и его нужно применять с еще большей осторожностью, а лучше не применять вовсе
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
приведение типов??? | nikozavr | C# (си шарп) | 1 | 14.05.2011 22:29 |
NetUserAdd() приведение типов | disaer | Общие вопросы C/C++ | 2 | 12.05.2011 08:09 |
Приведение пользовательских типов | peplenko | Общие вопросы C/C++ | 6 | 18.04.2011 12:59 |
С - приведение типов | onewho | Общие вопросы C/C++ | 3 | 21.11.2010 00:12 |
Приведение типов в Qt | mike_tihomirov | Qt и кроссплатформенное программирование С/С++ | 1 | 19.06.2010 13:14 |