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

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

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

Вызов оператора приведения базового класса C++
C++ Ошибка приведения типов в MSVS 2008
C++ Алгоритм приведения к КНФ/ДНФ
Стили приведения типов C++
Приведения типа классов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 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
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.02.2014, 11:14     Отличие способов приведения #3
Цитата Сообщение от aLarman Посмотреть сообщение
кажется нет (оба вызывают int())
Такой пример к сожалению не показателен.

Цитата Сообщение от klynxe Посмотреть сообщение
Есть ли отличия между (int) и static_cast<int>?
Первое это преобразование в стиле си. Компилятор при нем пытается сделать static_cast, затем, если не получилось, reinterpret_cast, ну и const_cast до кучи: Приведение типов в C++.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:15     Отличие способов приведения #4
klynxe, никаких отличий, кроме формы записи. Люди которые занимаются производством языка с++ страдают фигней.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:19     Отличие способов приведения #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Такой пример к сожалению не показателен.
почему?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.02.2014, 11:22     Отличие способов приведения #6
Цитата Сообщение от aLarman Посмотреть сообщение
почему?
Потому как непонятно как именно скастовалось.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
28.02.2014, 11:22     Отличие способов приведения #7
почему?
надо было показать на примере приведения из сложного обьекта в другой сложный обьект, например.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 11:31     Отличие способов приведения #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
wot?
Расскажете будет круто
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
28.02.2014, 12:46     Отличие способов приведения #9
Цитата Сообщение от aLarman Посмотреть сообщение
Расскажете будет круто
Если б я знал, то б с удовольствием.
programina
 Аватар для programina
1912 / 597 / 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
6424 / 3798 / 879
Регистрация: 30.01.2014
Сообщений: 6,591
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
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
28.02.2014, 13:17     Отличие способов приведения #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если б я знал, то б с удовольствием.
зачем тогда заявлять что
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Потому как непонятно как именно скастовалось.
Цитата Сообщение от programina Посмотреть сообщение
Нужно сравнить ассемблерный вывод программ с (int) и static_cast<int>
логично что он будет разный...
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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++ Невозможность приведения к стандартному типу
Исправьте ошибку C2664 приведения типов C++
C++ Неявные приведения в операциях

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

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

Текущее время: 08:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru