Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Явное приведение типов C++

#cpp


Какая разница между двумя последними строками? И если в этом примере ее нет, то бывает
ли она вообще?

int n=9;
double a=double(n);
double b=(double)n;

    


Ответы

Ответ 1



Разницы никакой нет, можете добавить ещё double b=static_cast(n); в копилку, для полноты картины. Правда это немного сбиавает с толку, т.к. "приведение типов" зачастую превращается в создание другого типа, без использования явных операторов приведения, а за счёт конструктора. Как бы запутанно это не было, 3 различных синтаксиса дают одно и то же в результате(правда static_cast "умнее", но это к делу не относится) Также рекомендую к прочтению Item 27 в книге Скотта Мэйерса "Effective C++, Third Edition". Эта книга есть на русском языке.

Ответ 2



(type) expr — форма преобразования, которая была в C. type(expr) — появилась в C++. В плюсах допустимы оба варианта, первый оставлен для совместимости, да и только.

Ответ 3



В конкретном примере разницы нет. В общем случае бывает. Первая конструкция вызывает конструктор, передав ему соответствующие параметры, а вторая - это непосредственно операция приведения типа. Разница будет (если не ошибаюсь) с explicit-конструкторами и, возможно, с перегруженными операторами приведения. Что-то я уже не уверен в том, что сказал про разницу. Лучше подождать других ответов. Но про синтаксический смысл конструкций всё верно. Я вспомнил пример, где были проблемы с приведением. Некоторое время назад gcc не мог съесть такое (не знаю, научился ли сейчас): long long x = long long(smth); а так всё было нормально: long long x = (long long)smth; VS понимала оба варианта.

Комментариев нет:

Отправить комментарий