Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование переменных, из одного типа в другой. 
V
    Опции темы
Любитель
Дата 15.12.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Rockie, он хотел преобразовать из одного в другой тип, одинаковые по внутреннему представлению. Лучше всего это делать так, как сказал, JackYF. Я бы правда сделал конструктор с explicit (при разрастании структур случайные преобразования могут оказаться некстати). Да сишные кастования не использовал, а просто бы вызвал конструктор. Скажем так:
Код

B b(a);

Или так:
Код

B b;
b = B(a);


Если мы уверены, что две структуры имеют абсолютно одинаковое внутренне представление, то можно воспользоваться и другими способами (вроде memcpy). Но, по-моему, сие не для плюсов (я бы не стал делать).


--------------------
PM MAIL ICQ Skype   Вверх
Rockie
Дата 15.12.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(Любитель @  15.12.2006,  10:38 Найти цитируемый пост)
Rockie, он хотел преобразовать из одного в другой тип, одинаковые по внутреннему представлению. 

Любитель, а какой смысл создавать объект из такого же объекта? Если можно создать экземпляр этого же класса и пользоваться встроенным присваиванием. Возможно, такая необходимость и может возникнуть, но врядли это необходимо в данном случае. 




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
FelikZ
Дата 15.12.2006, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Старый Маразматик
**


Профиль
Группа: Участник
Сообщений: 380
Регистрация: 1.12.2006
Где: Vault 13

Репутация: нет
Всего: 5



Люди не стоит делать из мухи слона smile  Это был чисто теоритический
вопрос - просто я незнал как это зделать с помощью структур, а оказалось,
что это делается так же как и в классах...


--------------------
user posted image
PM WWW ICQ Skype   Вверх
NoNo
Дата 16.12.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 14.11.2006

Репутация: нет
Всего: нет



Я вообще тоже новичок......и как я знаю то, что преобразование в C++ лудше делать спомощью 
 static_cast<тип>(значение)
PM MAIL   Вверх
Anikmar
Дата 16.12.2006, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(NoNo @ 16.12.2006,  12:57)
Я вообще тоже новичок......и как я знаю то, что преобразование в C++ лудше делать спомощью 
 static_cast<тип>(значение)

Абсолютно верно - типа преобразование при помощи скобок - старый стиль Си...
(Хотя у Лаффоре основной аргумент использования static_cast - это то, что его поиском удобнее искать в случае чего)

Но привычка вторая натура - никак не могу себя заставить такое длинное писать  smile 
PM MAIL ICQ   Вверх
UnrealMan
Дата 16.12.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Любитель @  15.12.2006,  10:38 Найти цитируемый пост)
Да сишные кастования не использовал, а просто бы вызвал конструктор.

Цитата(Любитель @  15.12.2006,  10:38 Найти цитируемый пост)
b = B(a);

B(a) – это преобразование типа, эквивалентное (B)a

Цитата(NoNo @  16.12.2006,  12:57 Найти цитируемый пост)
преобразование в C++ лудше делать спомощью 
 static_cast<тип>(значение) 

По-моему, ничем оно не лучше, кроме тех случаев, когда cast- или functional- форма преобразования делает не то, что на самом деле требуется.
PM MAIL   Вверх
Любитель
Дата 18.12.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(UnrealMan @  16.12.2006,  14:42 Найти цитируемый пост)
B(a) – это преобразование типа, эквивалентное (B)a

Это вызов конструктора. Для типа, не являющегося классом - это приведение в стиле функций.

Цитата(UnrealMan @  16.12.2006,  14:42 Найти цитируемый пост)
cast- или functional- форма преобразования

 smile cast == привденение. Под преобразованием обычно понимают именно преобразование (например, строки в число).

Цитата(UnrealMan @  16.12.2006,  14:42 Найти цитируемый пост)
По-моему, ничем оно не лучше, кроме тех случаев, когда cast- или functional- форма преобразования делает не то, что на самом деле требуется. 

1. Оно явно виднеется в коде невооружённым глазом.
2. Оно не позволит сделать многое, что позволят сделать кастования в сишном стиле. Типосейфити очень важная вещь в плюсах.


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 18.12.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(Любитель @ 18.12.2006,  14:58)
2. Оно не позволит сделать многое, что позволят сделать кастования в сишном стиле. Типосейфити очень важная вещь в плюсах.

Этого я не знал. Можно примерчик? 
PM MAIL ICQ   Вверх
nickless
Дата 18.12.2006, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Anikmar @ 18.12.2006,  14:21)
Этого я не знал. Можно примерчик?

Тут Страуструп пишет:
Код
    int a = 7;
    double* p1 = (double*) &a;        // ok (but a doesn't point to a double)
    double* p2 = static_cast<double*>(&a);        // error
    double* p2 = reinterpret_cast<double*>(&a);    // ok: I really mean it

    const int c = 7;
    int* q1 = &c;            // error
    int* q2 = (int*)&c;        // ok (but *q2=2; is still invalid code and may fail)
    int* q3 = static_cast<int*>(&c);    // error: static_cast doesn't cast away const
    int* q4 = const_cast<int*>(&c);    // I really mean it



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Anikmar
Дата 18.12.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Мда... Век живи - век учись.

Все равно дураком помрешь...
PM MAIL ICQ   Вверх
UnrealMan
Дата 19.12.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Любитель @  18.12.2006,  14:58 Найти цитируемый пост)
Это вызов конструктора. Для типа, не являющегося классом - это приведение в стиле функций.

Да что ты говоришь? :-)

Хочешь сказать, вот здесь

Код
struct B {} b;
struct A
{
    operator B() { return b; }
} a;

int main()
{
    B b = B(a); // это мы конструктор B(a) здесь вызываем, да? :-)
}

вызов конструктора?

Цитата(ISO/IEC 14882:2003(E) §5.2.3 Explicit type conversion (functional notation))
A simple-type-specifier (7.1.5) followed by a parenthesized expression-list constructs a value of the specified type given the expression list. If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).


Цитата(Любитель @  18.12.2006,  14:58 Найти цитируемый пост)
cast == привденение

Что приведение типа, что преобразование типа – я как-то это не различаю.

Цитата(Любитель @  18.12.2006,  14:58 Найти цитируемый пост)
1. Оно явно виднеется в коде невооружённым глазом.

Угу, и занимает много места :-)

Цитата(Любитель @  18.12.2006,  14:58 Найти цитируемый пост)
Оно не позволит сделать многое, что позволят сделать кастования в сишном стиле. 

Я это прекрасно знаю, потому и написал:

Цитата(UnrealMan @  16.12.2006,  14:42 Найти цитируемый пост)
кроме тех случаев, когда cast- или functional- форма преобразования делает не то, что на самом деле требуется. 

Например, в ситуации, когда cast- или functional- форма приведения оказывается эквивалентной a static_cast followed by a const_cast, а нужно только static_cast-приведение, следует использовать именно оператор static_cast. Если указатель/ссылка базового типа приводится к указателю/ссылке производного, то следует избегать возможного приведения в виде reinterpret_cast (которое наверняка будет ошибочным). А вот зачем использовать оператор static_cast в приведении, скажем, void * к int * ? Или же в приведении вроде B(a), как это делалось выше? С чем тут можно спутать static_cast?

Это сообщение отредактировал(а) UnrealMan - 19.12.2006, 11:53
PM MAIL   Вверх
JackYF
Дата 19.12.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



UnrealMan, неточность у тебя.


Цитата(Любитель @  18.12.2006,  14:58 Найти цитируемый пост)
Для типа, не являющегося классом 

Видел? А у тебя и А и В - классы.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 20.12.2006, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(JackYF @  19.12.2006,  14:49 Найти цитируемый пост)
UnrealMan, неточность у тебя.

Может, я ещё не проснулся и поэтому туго соображаю. Покажи пальцем, где у меня неточность.

Цитата(JackYF @  19.12.2006,  14:49 Найти цитируемый пост)
Видел? А у тебя и А и В - классы.

Вот именно, что у меня это классы, а B(a) при этом – «приведение в стиле функции», где нет никакого вызова конструктора. И там, где B(a) приводит к вызову конструктора, это всё равно «приведение в стиле функции».

Это сообщение отредактировал(а) UnrealMan - 20.12.2006, 09:17
PM MAIL   Вверх
Любитель
Дата 20.12.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



UnrealMan, другой пример.
Код

struct A
{
    A(int a, int b) {}
}

int main()
{
    A a = A(1, 4); // глупо при ините, но формально допутимо
    а = А(3, 7); // нормально. Создаётся временный объект и присваивается.
}


Для последнего случая компилер часто использует оптимизацию, для предотвращение лишнего копирования. Впрочем не всегда.

Суть в том, что приведение от двух элементов невозможно (очевидно). В твоём примере также вызывается конструктор для конструирования временных объектов. Если интересует ссылка на стандарт - приду домой посмотрю, приведу.

Цитата(UnrealMan @  19.12.2006,  11:37 Найти цитируемый пост)
Что приведение типа, что преобразование типа – я как-то это не различаю.

А зря. Это разные вещи.


--------------------
PM MAIL ICQ Skype   Вверх
UnrealMan
Дата 20.12.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Любитель @  20.12.2006,  13:52 Найти цитируемый пост)
В твоём примере также вызывается конструктор для конструирования временных объектов.

Хорошо, может вызваться копирующий конструктор класса B (именно за счёт B(a) – как дополнение к вызову конструктора за счёт инициализации объекта b). И что, из-за этого преобразование B(a) ты будешь называть вызовом конструктора? :-)

Цитата(Любитель @  20.12.2006,  13:52 Найти цитируемый пост)
Суть в том, что приведение от двух элементов невозможно (очевидно). 

Преобразование возможно.

Цитата(Любитель @  20.12.2006,  13:52 Найти цитируемый пост)
А зря. Это разные вещи. 

Приведение – это преобразование единичного выражения.

Это сообщение отредактировал(а) UnrealMan - 21.12.2006, 10:18
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.