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

Рейтинг: 4Ответов: 3Опубликовано: 17.04.2015

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

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

Ответы

▲ 3Принят

Разницы никакой нет, можете добавить ещё

double b=static_cast<double>(n);

в копилку, для полноты картины. Правда это немного сбиавает с толку, т.к. "приведение типов" зачастую превращается в создание другого типа, без использования явных операторов приведения, а за счёт конструктора. Как бы запутанно это не было, 3 различных синтаксиса дают одно и то же в результате(правда static_cast "умнее", но это к делу не относится)

Также рекомендую к прочтению Item 27 в книге Скотта Мэйерса "Effective C++, Third Edition". Эта книга есть на русском языке.

▲ 3

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

▲ 2

В конкретном примере разницы нет.

В общем случае бывает. Первая конструкция вызывает конструктор, передав ему соответствующие параметры, а вторая - это непосредственно операция приведения типа.

Разница будет (если не ошибаюсь) с explicit-конструкторами и, возможно, с перегруженными операторами приведения.

Что-то я уже не уверен в том, что сказал про разницу. Лучше подождать других ответов. Но про синтаксический смысл конструкций всё верно.

Я вспомнил пример, где были проблемы с приведением. Некоторое время назад gcc не мог съесть такое (не знаю, научился ли сейчас):

long long x = long long(smth);

а так всё было нормально:

long long x = (long long)smth;

VS понимала оба варианта.