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

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

Войти
Регистрация
Восстановить пароль
 
klynxe
10 / 10 / 4
Регистрация: 07.09.2012
Сообщений: 538
#1

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

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

Есть ли отличия между (int) и static_cast<int>?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.02.2014, 10:55     Отличие способов приведения
Посмотрите здесь:

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

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

Неявные приведения в операциях - C++
В умной книжке написано, что в арифметических выражениях все операнды приводятся к одному типу, если это возможно, пример: int a = 5;...

Приведения типа классов - C++
#include &lt;iostream&gt; class Number2; class Number { public: int i; Number(int ii = 0) : i(ii) {} Number(const...

Невозможность приведения к стандартному типу - C++
Не могу привести к стандартному типу объект класса. Вот код: class Casting { private: double X; public: Casting() :...

Перегрузка операторов приведения типов - C++
Доброго времени суток! Возник вопрос по перегрузке оператора преобразования типа const char*. Вот пример: class Integer { public: ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
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;
}
тест подтверждает
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
28.02.2014, 11:14     Отличие способов приведения #3
Цитата Сообщение от aLarman Посмотреть сообщение
кажется нет (оба вызывают int())
Такой пример к сожалению не показателен.

Цитата Сообщение от klynxe Посмотреть сообщение
Есть ли отличия между (int) и static_cast<int>?
Первое это преобразование в стиле си. Компилятор при нем пытается сделать static_cast, затем, если не получилось, reinterpret_cast, ну и const_cast до кучи: Приведение типов в C++.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:15     Отличие способов приведения #4
klynxe, никаких отличий, кроме формы записи. Люди которые занимаются производством языка с++ страдают фигней.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:19     Отличие способов приведения #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Такой пример к сожалению не показателен.
почему?
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
28.02.2014, 11:22     Отличие способов приведения #6
Цитата Сообщение от aLarman Посмотреть сообщение
почему?
Потому как непонятно как именно скастовалось.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:22     Отличие способов приведения #7
почему?
надо было показать на примере приведения из сложного обьекта в другой сложный обьект, например.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:31     Отличие способов приведения #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
wot?
Расскажете будет круто
SatanaXIII
Супер-модератор
Эксперт С++
5602 / 2636 / 242
Регистрация: 01.11.2011
Сообщений: 6,495
Завершенные тесты: 1
28.02.2014, 12:46     Отличие способов приведения #9
Цитата Сообщение от aLarman Посмотреть сообщение
Расскажете будет круто
Если б я знал, то б с удовольствием.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 12:59     Отличие способов приведения #10
Нужно сравнить ассемблерный вывод программ с (int) и static_cast<int>

Bash
g++ -S -ocode.s code.cpp
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
28.02.2014, 13:15     Отличие способов приведения #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 можно получить слабо прогнозируемое поведение. С С++ кастами система типов языка не позволила бы провести многие небезопасные действия, выдав диагностику еще на этапе компиляции.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 13:17     Отличие способов приведения #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если б я знал, то б с удовольствием.
зачем тогда заявлять что
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
Цитата Сообщение от programina Посмотреть сообщение
Нужно сравнить ассемблерный вывод программ с (int) и static_cast<int>
логично что он будет разный...
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
28.02.2014, 14:38     Отличие способов приведения #13
Цитата Сообщение от aLarman Посмотреть сообщение
логично что он будет разный...
В зависимости от ситуации. Может быть и одинаковым.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
28.02.2014, 14:52     Отличие способов приведения #14
Цитата Сообщение от Tulosba Посмотреть сообщение
В зависимости от ситуации.
Вот это меня и пугает...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2014, 15:34     Отличие способов приведения
Еще ссылки по теме:

Алгоритм приведения к КНФ/ДНФ - C++
Что-то я запарился, никак придумать не могу... Допустим имеется у нас формула x&amp;y|z Дерево разбора строится как. ...

Небезопасность приведения. Не понимаю Прата - C++
О коде, который описан в книге, слегка переправлен мной: #include &lt;iostream&gt; using std::cout; class Grand { public: ...

Добавить в класс оператор приведения к double - C++
Добавить в класс Rational оператор приведения к double. struct Rational { Rational(int numerator = 0, int denominator = 1); ...

Вызов оператора приведения базового класса - C++
Добрый день. У меня есть иерархия классов. class A: B { ... operator const char* () const; ...


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

Или воспользуйтесь поиском по форуму:
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 15:34     Отличие способов приведения #15
логично что он будет разный..
логичнее это проверить.
Yandex
Объявления
28.02.2014, 15:34     Отличие способов приведения
Ответ Создать тему
Опции темы

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