Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2011, 12:11   #1
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию Приведение/преобразование типов

Добрый день! Задумался вот над таким вопросом, а какая разница в следующих записях:

Код:
int x = 97;

cout << static_cast<char>(x); 
cout << char(x); 
cout << (char)x;
Результат вроде одинаковый дают. По стандарту C++ вроде нужно использовать static_cast. Но вот например в книге Б. Эккеля, ипользуется char(x), эдакая запись в виде вызова функции. Она то что значит?

Спасибо.
rommster вне форума Ответить с цитированием
Старый 29.05.2011, 12:31   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
cout << (char)x;
приведение в стиле С
Цитата:
cout << char(x);
приведение в стиле функции
Цитата:
cout << static_cast<char>(x);
статическое приведение С++.

в данном случае смысл один и тот же, правильнее последнее(в моем порядке, то есть статик_каст), так как позволяет контролировать тип приведения типов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.05.2011, 13:10   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 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
pproger вне форума Ответить с цитированием
Старый 29.05.2011, 18:56   #4
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Спасибо за ответы, и сразу же появились новые вопросы:

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в данном случае смысл один и тот же
В данном случае да, я заметил, а в каких ситуациях всё же будет разница между приведением в стиле С и приведением в стиле функции (статик каст не беру, т.к. вы уже отметили отличие)? В учебнике нашёл что-то типа:
Существует две формы: каноническая и функциональная:
1) (имя_типа) операнд
2) имя_типа (операнд)
Но какая разница, и в каких случаях использовать одно, а в каких другое - ни слова не сказано.


Цитата:
Сообщение от pproger Посмотреть сообщение
кстати, преобразование типов совсем другое, в приведению не относится
Что же тогда правильнее назвать "преобразованием". Термины немного путаю, думал что это скорее всего синонимы. Поясните, пожалуйста.
rommster вне форума Ответить с цитированием
Старый 29.05.2011, 19:02   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 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
pproger вне форума Ответить с цитированием
Старый 29.05.2011, 19:21   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Первое - это C'шное приведение, как уже было сказано; второе - явный вызов конструктора, для фундаментальных типов они ничем не отличаются, для типов, определенных пользователем, отличия существенные.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 30.05.2011, 00:52   #7
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

ТС, все очень просто. Если вы программируете на C++, то просто не используйте ничего, кроме следующих вариантов:

static_cast<T> - приводит тип к заданному на этапе компиляции программы. Компилятор проверит правильность привидения, и в случаи ошибки программа не скомпилируется

dynamic_cast<T> - приводит тип к заданному на этапе выполнения программы. В случаи неправильного приведения возвращается нулевой указатель, либо генерируется исключение

reinterpret_cast<T> - наиболее опасный способ приведения типа. Корректность приведения типа не проверяется вообще, и в случаи не правильного использования может привести к непредсказуемым последствиям.

Вообще все эти приведения типов играют роль только при использовании с объектами классов, привидение базовых типов встречается очень редко, и как правило не играет никакой роли, какой из трех вариантов использовать.
Но в любом случаи, использование большого количества приведений типов в программе, говорит о том, что она плохо спроектирована. Приведений типов следует избегать или пользоваться ими как можно реже.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 30.05.2011, 06:42   #8
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Всем спасибо за полезную информацию, постараюсь разобраться.
rommster вне форума Ответить с цитированием
Старый 30.05.2011, 14:37   #9
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
не используйте ничего, кроме следующих вариантов
??? а const_cast<T> ?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 30.05.2011, 14:44   #10
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
??? а const_cast<T> ?
const_cast<T> немного не из той оперы, и его нужно применять с еще большей осторожностью, а лучше не применять вовсе
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
приведение типов??? 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