Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
#1

В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? - C++

21.08.2016, 19:22. Просмотров 337. Ответов 15
Метки нет (Все метки)

В чем разница между Си'шным приведением типа:
C++
1
2
3
4
...
int x{5};
ifs.write( (char*)&x, sizeof(int) );
...
и унарной шаблонной функцией static_cast:
C++
1
2
3
4
...
int x{5};
ifs.write( static_cast<char*>(&x), sizeof(int) );
...
с учётом того, что во втором случае не работает код
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2016, 19:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос В чем разница между Си'шным приведением типа и унарной шаблонной функцией static_cast? (C++):

Разница между приведением типов - C++
Всем пт! Поясните плз разницу между приведениями типов: double (a); (double) a; static_cast &lt;double&gt; (a);

В чем разница между виртуальной и чисто виртуальной функцией? - C++
в чем разница между виртуальной и чисто виртуальной функцией? virtual void print(){..} virtual void ex(..)=0;

Разница между рекурсивной функцией и обычной - C++
Как можно посчитать разницу между рекурсивной функцией и обычной? Там как то можно время работы функций высчитывать, как это сделать? Какие...

Разница между перегрузкой операторов внешней или внутренней функцией - C++
Перегружаю operator* (умножаю экземпляры своего класса между собой). Как лучше перегрузить: MyClass operator*(MyClass a, MyClass b){}или ...

В чем разница между X x; и X x()? - C++
Корректный ли этот ответ?

В чем разница между [] и * ? - C++
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...

15
GbaLog-
Любитель чаепитий
2900 / 1357 / 333
Регистрация: 24.08.2014
Сообщений: 4,799
Записей в блоге: 1
Завершенные тесты: 2
21.08.2016, 19:38 #2
Bretbas, reinterpret_cast<>() пробовали?
А в чем разница и что лучше можете прочесть на хабре.
0
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
21.08.2016, 20:18  [ТС] #3
GbaLog-, я в курсе, что reinterpret_cast<>() работает. Мне интересно, почему static_cast не работает
0
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
21.08.2016, 20:24 #4
Bretbas, привести int* к char* для компилятора равносильно, что привести Student* к Kaktus*.

Подробно объяснил?
2
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
21.08.2016, 20:28  [ТС] #5
Понятно, я так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.08.2016, 20:34 #6
Цитата Сообщение от Bretbas Посмотреть сообщение
почему static_cast не работает
Потому что static_cast преобразует только совместимые типы.
Если хочется обойтись static_cast'ами, то нужно предварительно преобразовать в void*:
C++
1
static_cast<char*>(static_cast<void*>(&x))
1
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
21.08.2016, 20:43  [ТС] #7
Спасибо)
0
hoggy
6653 / 2841 / 486
Регистрация: 15.11.2014
Сообщений: 6,294
Завершенные тесты: 1
22.08.2016, 10:11 #8
Цитата Сообщение от Bretbas Посмотреть сообщение
так понимаю static_cast приводит тип с проверкой компилятора, а reinterpret_cast приводит без проверки?
огааа.


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



reinterpret_cast - реинтерпретировать тип.
например у вас есть тип "кошка".
а вы говорите компилятору:
"это - не кошка, а собака".

реинтерпретировать можно только ссылкки или указатели.
1
Babysitter
81 / 108 / 35
Регистрация: 23.11.2015
Сообщений: 336
Завершенные тесты: 1
22.08.2016, 10:40 #9
Что делает приведение типов в стиле С: пытается использовать static_cast, если не получается, использует reinterpret_cast. Далее, если нужно, использует const_cast.(с)

Добавлено через 13 минут
это кстати и есть официально одобренный способ побайтовой записи
чего бы то ни было в файл с помощью файловых потоков?

C++
1
2
3
struct X { /* .. */} x;
/* filling x */
fs.write( reinterpret_cast<char*>(&x), sizeof(X) );
выглядит уродливо
0
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
23.08.2016, 17:18  [ТС] #10
Babysitter, можно так:
C++
1
2
3
4
5
6
7
8
9
10
...
template<class T> char* toBytes( T& value )
{
void* address { &value };
return static_cast<char*>( address );
}
...
int x;
f.write( toBytes( x ), sizeof( x ) );
...
0
dimcoder
Полярный
466 / 438 / 68
Регистрация: 11.09.2011
Сообщений: 1,136
23.08.2016, 19:22 #11
Цитата Сообщение от Bretbas Посмотреть сообщение
В чем разница между Си'шным приведением типа
Цитата Сообщение от Bretbas Посмотреть сообщение
и унарной шаблонной функцией static_cast
добавлю, что static_cast легче найти поиском и он бросается в глаза в отличие от. Следовательно легче находить баги связанные с приведением типов.
1
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
23.08.2016, 19:48  [ТС] #12
dimcoder, тогда добавлю, что это относится не только к static_cast, но и reinterpret_cast, dynamic_cast и const_cast. Они очевидно бросаются в глаза, чем Си'шное приведение
0
HelicopterK52
660 / 203 / 28
Регистрация: 27.07.2016
Сообщений: 474
Завершенные тесты: 1
23.08.2016, 20:02 #13
Bretbas, раз уж шаблон, то std::addressof(value), а не &value
0
Bretbas
Каждому свое
300 / 99 / 27
Регистрация: 05.08.2013
Сообщений: 1,151
Завершенные тесты: 1
23.08.2016, 20:16  [ТС] #14
HelicopterK52,
раз уж шаблон, то std::addressof(value), а не &value
Очередная std функция. И что она делает? Я плохо пока разбираюсь с новым стандартом((( объясните, раз на то пошло

Добавлено через 2 минуты
Точнее я понимаю примерно что она делает. Но почему она лучше чем обычный &
0
GbaLog-
Любитель чаепитий
2900 / 1357 / 333
Регистрация: 24.08.2014
Сообщений: 4,799
Записей в блоге: 1
Завершенные тесты: 2
23.08.2016, 20:21 #15
Цитата Сообщение от Bretbas Посмотреть сообщение
И что она делает?
http://en.cppreference.com/w/cpp/memory/addressof
Если пользоваться переводчиком Google'a, то: Получает фактический адрес объекта или функции ARG, даже в присутствии перегруженного оператора &.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2016, 20:21
Привет! Вот еще темы с ответами:

В чем разница между С и С++ - C++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы а в С их нету ?

В чем разница между malloc и new? - C++
в чем разница? что лучше использовать?

В чем разница между new и malloc()? - C++
Всем доброго дня ! Начал читать книгу Пахомов Б. &quot;C/C++ и MS Visual C++ 2008 для начинающих&quot; До этого прочитал С++ за 21 день. ...

В чем разница между вектором и массивом - C++
Я учу язык С/С++ и хотел у вас спросить в чем разница между вектором и массивом ? кроме тогдо что вектор создается vector&lt;int&gt; m; а массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
23.08.2016, 20:21
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru