Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
12 / 12 / 4
Регистрация: 07.09.2012
Сообщений: 542
1

Отличие способов приведения

28.02.2014, 10:55. Показов 1291. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ли отличия между (int) и static_cast<int>?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2014, 10:55
Ответы с готовыми решениями:

Отличие static_cast от приведения в стиле С
Собственно вопрос в заголовке. Говорят что Static_cast безопасней чем приведение типа в стиле С, но...

Отличие способов передачи массива в функцию
В чем отличие: double sum(double x) от double sum(double *x) ?

В чём отличие разных способов объявления переменных?
в чем отличие int a(2); от int a=2; И как писать правильней

Отличие двух способов создания String
Доброго времени суток, объясните пожалуйста: String s1 = new String(); String s2 = &quot;&quot;; //Эти 2-е...

14
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:06 2
кажется нет (оба вызывают int())

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
class A
{
public:
    A():x(0){std::cout<<"Constr def"<<std::endl;}
    A(int j):x(j){std::cout<<"Constr with"<<std::endl;}
    operator int()
    {
        std::cout<<"opertor int()"<<std::endl;
        return x;
    }
    ~A(){std::cout<<"Destr"<<std::endl;}
private:
    int x;
};
int main(int argc, char* argv[])
{
    A clA(10);
    int x;
    x = (int)clA;
    x = static_cast<int>(clA);
 
    system("pause");
    return 0;
}
тест подтверждает
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.02.2014, 11:14 3
Цитата Сообщение от aLarman Посмотреть сообщение
кажется нет (оба вызывают int())
Такой пример к сожалению не показателен.

Цитата Сообщение от klynxe Посмотреть сообщение
Есть ли отличия между (int) и static_cast<int>?
Первое это преобразование в стиле си. Компилятор при нем пытается сделать static_cast, затем, если не получилось, reinterpret_cast, ну и const_cast до кучи: Приведение типов в C++.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:15 4
klynxe, никаких отличий, кроме формы записи. Люди которые занимаются производством языка с++ страдают фигней.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:19 5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Такой пример к сожалению не показателен.
почему?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.02.2014, 11:22 6
Цитата Сообщение от aLarman Посмотреть сообщение
почему?
Потому как непонятно как именно скастовалось.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:22 7
почему?
надо было показать на примере приведения из сложного обьекта в другой сложный обьект, например.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 11:31 8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
wot?
Расскажете будет круто
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
28.02.2014, 12:46 9
Цитата Сообщение от aLarman Посмотреть сообщение
Расскажете будет круто
Если б я знал, то б с удовольствием.
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 12:59 10
Нужно сравнить ассемблерный вывод программ с (int) и static_cast<int>

Bash
g++ -S -ocode.s code.cpp
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
28.02.2014, 13:15 11
Лучший ответ Сообщение было отмечено klynxe как решение

Решение

Цитата Сообщение от klynxe Посмотреть сообщение
Есть ли отличия между (int) и static_cast<int>?
Отличия будут появляться и пропадать в зависимости от ситуации.
В таком простом случае поведение будет эквивалентно. Одним из достоинств второго способа является простота поиска в коде. Достоинство первого - краткость. Однако в более сложны случаях начинают появляться особенности, которые приведения в стиле Си не позволяют преодолеть, маскируют проблему. Например:
C++
1
2
3
4
5
6
7
8
9
10
void foo(int const * a)
{
    double const * a0 = static_cast<double const *>(a); //нельзя, нужен reinterpret_cast
    double const * a1 = (double const *)a; //можно
    double const * a2 = reinterpret_cast<double const *>(a); //можно, но нельзя без const
 
    int * a3 = static_cast<int *>(a); // нельзя, нужен const_cast
    int * a4 = (int *)a; // можно
    int * a5 = const_cast<int *>(a); // можно
}
Как видно С-style cast плюет на систему типов С++, позволяя обходить ее ограничения (замечу, однако, что иногда оно так и нужно, но ты должен знать что делаешь).
Из-а того, что C-style cast всегда выглядит одинаково, можно замаскировать проблему случайно сняв константность или изменив тип на несовместимый. Последствия этого могут вылезти уже в рантайме, когда будет трудно диагностировать проблему (а ведь его еще и поиском по коду трудно найти).
Вот в таком примере
C++
1
2
3
4
5
template <typename T>
void foo1(T a)
{
    A a1 = (A)a;
}
в зависимости от типов T и A можно получить слабо прогнозируемое поведение. С С++ кастами система типов языка не позволила бы провести многие небезопасные действия, выдав диагностику еще на этапе компиляции.
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
28.02.2014, 13:17 12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если б я знал, то б с удовольствием.
зачем тогда заявлять что
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
Цитата Сообщение от programina Посмотреть сообщение
Нужно сравнить ассемблерный вывод программ с (int) и static_cast<int>
логично что он будет разный...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
28.02.2014, 14:38 13
Цитата Сообщение от aLarman Посмотреть сообщение
логично что он будет разный...
В зависимости от ситуации. Может быть и одинаковым.
0
320 / 225 / 74
Регистрация: 22.11.2013
Сообщений: 865
Записей в блоге: 1
28.02.2014, 14:52 14
Цитата Сообщение от Tulosba Посмотреть сообщение
В зависимости от ситуации.
Вот это меня и пугает...
0
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 15:34 15
логично что он будет разный..
логичнее это проверить.
0
28.02.2014, 15:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2014, 15:34
Помогаю со студенческими работами здесь

формулы приведения
Я конечно понимаю , что моя тема выглядит немного тупо на фоне названий других.... но собственно...

приведения типов
Мне надо вывести на форму значение типа double. Но ui-&gt;w1-&gt;setText(c1) может принимать только...

приведения типов
здравствуйте подскажите как привести результат запроса linq к полю items контрола combobox. вот...

Функция приведения от 0 до 1
Добрый день, подскажите есть ли в базовых библиотеках C# функция для расчета прогресса, чтобы не...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru