powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по приведению типов
15 сообщений из 15, страница 1 из 1
Вопрос по приведению типов
    #34914695
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такой код компилится нормально:
Код: plaintext
1.
2.
3.
	unsigned char	pack[csz_pack];
	// ...
	m_shp_base_net->Send( (char *)pack, csz_pack );

Решил опробовать операторы приведения:

такой код не компилится:
Код: plaintext
1.
	m_shp_base_net->Send( static_cast<char *>(pack), csz_pack );
	
я в нем что-то не правильно написал или же static_cast не способен делать такие преобразования?

такой работает:
Код: plaintext
1.
	m_shp_base_net->Send( reinterpret_cast<char *>(pack), csz_pack );
	
так правильно?
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34914821
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такой код компилится нормально:
Код: plaintext
1.
2.
3.
	unsigned char	pack[csz_pack];
	// ...
	m_shp_base_net->Send( (char *)pack, csz_pack );

Решил опробовать операторы приведения:

такой код не компилится:
Код: plaintext
1.
	m_shp_base_net->Send( static_cast<char *>(pack), csz_pack );
	
я в нем что-то не правильно написал или же static_cast не способен делать такие преобразования?
[/quot]
Ну еще бы они эти типы в наследственных связях не замечены
Tubrikтакой работает:
Код: plaintext
1.
	m_shp_base_net->Send( reinterpret_cast<char *>(pack), csz_pack );
	
так правильно?
вот так правильно
reinterpret_cast пребразует все во все как старое приведение
static_cast и dynamic_cast только для типов связанных отношением наследования, причем static делает преобразование несмотря ни на что, удобно приводится к предку, а вот к потомку не очень, dynamic используется при приведении к потомку, ежели привести к потомку нельзя возвращает 0
однако у dynamic существенный недостаток - время выполнения.
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34914828
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, понял
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34915297
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
записи конечно выходят не то, что в простом варианте, длинные и неуклюжие..
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34915416
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведение типа вещь нештатная, а посему длинно не значит плохо. Они в коде глаз режут и сразу видно что к чему
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34915506
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded
Ну еще бы они эти типы в наследственных связях не замечены
вот так правильно
reinterpret_cast пребразует все во все как старое приведение
static_cast и dynamic_cast только для типов связанных отношением наследования, причем static делает преобразование несмотря ни на что, удобно приводится к предку, а вот к потомку не очень, dynamic используется при приведении к потомку, ежели привести к потомку нельзя возвращает 0
однако у dynamic существенный недостаток - время выполнения.
АФАИК, это не совсем верно. Старое приведение в раздичных ситуациях может повести себя как любое из 4 современных приведений (тут еще const_cast не упоминали :). static_cast выполняет приведение, основываясь на статической информации о типах. Родственные связи при этом не обязательны. Динамическое приведение основывается на информации о типах времени выполнения и актуально для полиморфных типов. reinterpret_cast заставляет интерпретировать двоичное представление одного типа как двоичное представление другого типа. Поскольку эти представления зависят от платформы, пользоваться этим приведением надо осторожно. В рассматриваемом примере мы хотим проинтерпретировать нассив чисел как массив байт. Собственно, другим образом преобразовывать массивы (не элементы массивов, а сами массивы) не имеет смысла. Поэтому действительно следует использовать reinterpret_cast.
И в заключение небольшой пример.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>

void doit(double a)
{
        std::cout<<a<<std::endl;
}


int main()
{
        int a= 1 ;
        doit(a);//неявное преобразования из 1 в 1.
        doit((double)a); // тоже самое, но явно, соотвествует static_cast
        doit((double&)a); // интерпретировать целочисленное значение 1 как значение вещественного числа, соответствует reinterpret_cast
        doit(static_cast<double>(a));
        doit(reinterpret_cast<double&>(a));
        return  0 ;
}
Вот вывод программы.

1
1
-0.214554
1
-0.214554

Как видим, старое приведение ведет себя по-разному. Использование нового синтаксиса позволяет более точно выразить желаемый эффект и предотвратить ошибки. В этом примере, например (каламбур), нельзя выполнить static_cast<double&>(a) и reinterpret_cast<double>(a).
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34915927
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
приведение(тип &) - что это означает?
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34916227
grieg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
& -- ссылка. То есть ты хочешь взять не копию значения, а именно саму переменную.
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34916419
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно, я не мог понять, зачем ф-ии
void doit(double a)
передавать ссылку если она не готова ее принять
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #34916712
smskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а еще есть приведение с помощью конструктора
например


Код: plaintext
1.
2.
3.
int i=int( 7 . 9 );
double d= 0 . 00999 ;
float f=float(d);
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #35020229
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blinded Tubrikтакой код компилится нормально:
Код: plaintext
1.
2.
3.
	unsigned char	pack[csz_pack];
	// ...
	m_shp_base_net->Send( (char *)pack, csz_pack );

Решил опробовать операторы приведения:

такой код не компилится:
Код: plaintext
1.
	m_shp_base_net->Send( static_cast<char *>(pack), csz_pack );
	
я в нем что-то не правильно написал или же static_cast не способен делать такие преобразования?

Ну еще бы они эти типы в наследственных связях не замечены
Tubrikтакой работает:
Код: plaintext
1.
	m_shp_base_net->Send( reinterpret_cast<char *>(pack), csz_pack );
	
так правильно?
вот так правильно
reinterpret_cast пребразует все во все как старое приведение
static_cast и dynamic_cast только для типов связанных отношением наследования, причем static делает преобразование несмотря ни на что, удобно приводится к предку, а вот к потомку не очень, dynamic используется при приведении к потомку, ежели привести к потомку нельзя возвращает 0
однако у dynamic существенный недостаток - время выполнения.

Опять запутался.
Не пойму почему, в таком случае, получается такое преобразование:
Код: plaintext
1.
...
:m_shpAfpLocal( static_cast<FileAuto*>(NULL) )

reinterpret_cast тоже вроде работает, но почему целое приводится к указателю на объект посредством static_cast ?? В то время как
Код: plaintext
static_cast<char *>(pack)
не позволяет этого.
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #35020385
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tubrikне позволяет этого.

Потому что статик каст не знает связи между указателями на разные типы.
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #35020420
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потомочу все значения равны, но 0 равнее других.
Попробуй тоже самое проделать не с нулем - получишь по лбу
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #35020520
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedПотомочу все значения равны, но 0 равнее других.
Попробуй тоже самое проделать не с нулем - получишь по лбу

не знал об этой аксиоме
...
Рейтинг: 0 / 0
Вопрос по приведению типов
    #35020954
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто любому указателю можно присвоить значение 0 и любой указатель сравним с нулем
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос по приведению типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]