![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Pentium02 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 29.4.2006 Где: Россия Репутация: нет Всего: 1 |
Я новичок. Собственно чабж. Например как преобразовать int в char?
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
это C-style с++ style это <static_cast>,<dynamic_cast>,<reinterpret_cast> -------------------- СУВ, Partizan. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Partizan, ещё есть const_cast.
|
|||
|
||||
| Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Не хочу быть занудой, но все-таки вежливей было бы вначале обратиться к поиску - похожих тем наплодили уйму. Чисто int к char можно в весьма ограниченных пределах (-128 +127) Если исправить ошибку в примере, то так:
|
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Любитель, а какое отношение Const_cast имеет к преобр. типа??
он же только снимает константность |
|||
|
||||
| Гениальный123Робот |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 2.1.2006 Репутация: нет Всего: нет |
Добавлю, что если в эти пределы не укладываетесь, то компилятор никакой ошибки не выдаст, а будет работать в "эффекте сворачивания", чтобы все же поместить свой остаток в заданный интервал. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 4 Всего: 67 |
е-хе ))) и правда
char c = (char) i; -------------------- СУВ, Partizan. |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
vinter, const и volatile - атрибуты, определяющие тип (const int и int - это разные типы), именно ими занимается const_cast.
|
|||
|
||||
| zabivator |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 7.6.2006 Где: нск Репутация: 1 Всего: 2 |
+1 --------------------
#include <zabivator>int main( int, char * [] ){ while( Zabivator::жив() ) Zabivator::моск()++; return 0;} |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
zabivator, ты уже второй раз пишешь +1, а плюсик не давишь |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
Любитель,
Плюс за помощь ставится, а не за согласие |
|||
|
||||
| FelikZ |
|
|||
![]() Старый Маразматик ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 1.12.2006 Где: Vault 13 Репутация: нет Всего: 5 |
Привет люди!
А кто нибуть подскажет как можно преобразовать:
Так пишет: error C2440: 'type cast' : cannot convert from 'A' to 'B'. Это сообщение отредактировал(а) FelikZ - 14.12.2006, 21:25 -------------------- ![]() |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
FelikZ, структуры твои. Преобразование придется писать тоже тебе:
Например, сделай у B конструктор копирования, который принимает A:
Как-нибудь так. |
|||
|
||||
| FelikZ |
|
|||
![]() Старый Маразматик ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 1.12.2006 Где: Vault 13 Репутация: нет Всего: 5 |
Спасибо JackYF!
Все работает -------------------- ![]() |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Xenon, ну, насчет этого правил нет. imho плюс можно ставить когда считаешь нужным FelikZ, можно поинтересоваться что ты хочешь сделать?
и все. А если в твоих классах будут указатели, то тогда уже понадобится конструктор копирования и перегруженное присваивание. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Rockie, он хотел преобразовать из одного в другой тип, одинаковые по внутреннему представлению. Лучше всего это делать так, как сказал, JackYF. Я бы правда сделал конструктор с explicit (при разрастании структур случайные преобразования могут оказаться некстати). Да сишные кастования не использовал, а просто бы вызвал конструктор. Скажем так:
Или так:
Если мы уверены, что две структуры имеют абсолютно одинаковое внутренне представление, то можно воспользоваться и другими способами (вроде memcpy). Но, по-моему, сие не для плюсов (я бы не стал делать). |
||||
|
|||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
Любитель, а какой смысл создавать объект из такого же объекта? Если можно создать экземпляр этого же класса и пользоваться встроенным присваиванием. Возможно, такая необходимость и может возникнуть, но врядли это необходимо в данном случае. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| FelikZ |
|
|||
![]() Старый Маразматик ![]() ![]() Профиль Группа: Участник Сообщений: 380 Регистрация: 1.12.2006 Где: Vault 13 Репутация: нет Всего: 5 |
Люди не стоит делать из мухи слона
вопрос - просто я незнал как это зделать с помощью структур, а оказалось, что это делается так же как и в классах... -------------------- ![]() |
|||
|
||||
| NoNo |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 14.11.2006 Репутация: нет Всего: нет |
Я вообще тоже новичок......и как я знаю то, что преобразование в C++ лудше делать спомощью
static_cast<тип>(значение) |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Абсолютно верно - типа преобразование при помощи скобок - старый стиль Си... (Хотя у Лаффоре основной аргумент использования static_cast - это то, что его поиском удобнее искать в случае чего) Но привычка вторая натура - никак не могу себя заставить такое длинное писать |
|||
|
||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
B(a) – это преобразование типа, эквивалентное (B)a
По-моему, ничем оно не лучше, кроме тех случаев, когда cast- или functional- форма преобразования делает не то, что на самом деле требуется. |
||||
|
|||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
Это вызов конструктора. Для типа, не являющегося классом - это приведение в стиле функций.
1. Оно явно виднеется в коде невооружённым глазом. 2. Оно не позволит сделать многое, что позволят сделать кастования в сишном стиле. Типосейфити очень важная вещь в плюсах. |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Этого я не знал. Можно примерчик? |
|||
|
||||
| nickless |
|
||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Тут Страуструп пишет:
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Мда... Век живи - век учись.
Все равно дураком помрешь... |
|||
|
||||
| UnrealMan |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Да что ты говоришь? :-) Хочешь сказать, вот здесь
вызов конструктора?
Что приведение типа, что преобразование типа – я как-то это не различаю. Угу, и занимает много места :-)
Я это прекрасно знаю, потому и написал:
Например, в ситуации, когда cast- или functional- форма приведения оказывается эквивалентной a static_cast followed by a const_cast, а нужно только static_cast-приведение, следует использовать именно оператор static_cast. Если указатель/ссылка базового типа приводится к указателю/ссылке производного, то следует избегать возможного приведения в виде reinterpret_cast (которое наверняка будет ошибочным). А вот зачем использовать оператор static_cast в приведении, скажем, void * к int * ? Или же в приведении вроде B(a), как это делалось выше? С чем тут можно спутать static_cast? Это сообщение отредактировал(а) UnrealMan - 19.12.2006, 11:53 |
||||||||||
|
|||||||||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
UnrealMan, неточность у тебя.
Видел? А у тебя и А и В - классы. |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Может, я ещё не проснулся и поэтому туго соображаю. Покажи пальцем, где у меня неточность. Вот именно, что у меня это классы, а B(a) при этом – «приведение в стиле функции», где нет никакого вызова конструктора. И там, где B(a) приводит к вызову конструктора, это всё равно «приведение в стиле функции». Это сообщение отредактировал(а) UnrealMan - 20.12.2006, 09:17 |
|||
|
||||
| Любитель |
|
||||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 24 Всего: 92 |
UnrealMan, другой пример.
Для последнего случая компилер часто использует оптимизацию, для предотвращение лишнего копирования. Впрочем не всегда. Суть в том, что приведение от двух элементов невозможно (очевидно). В твоём примере также вызывается конструктор для конструирования временных объектов. Если интересует ссылка на стандарт - приду домой посмотрю, приведу.
А зря. Это разные вещи. |
||||
|
|||||
| UnrealMan |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Хорошо, может вызваться копирующий конструктор класса B (именно за счёт B(a) – как дополнение к вызову конструктора за счёт инициализации объекта b). И что, из-за этого преобразование B(a) ты будешь называть вызовом конструктора? :-)
Преобразование возможно. Приведение – это преобразование единичного выражения. Это сообщение отредактировал(а) UnrealMan - 21.12.2006, 10:18 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |