В чем разница между приведением типов и преобразованием типов в C ++ или Java? - PullRequest
16 голосов
/ 29 октября 2010

В чем разница между приведением типов и преобразованием типов в c ++ или java?

Ответы [ 8 ]

18 голосов
/ 29 октября 2010

Тип приведение обрабатывает значение (блок памяти), на которое ссылается переменная, как тип, отличный от типа, который объявлена ​​как переменная.

Тип преобразование фактически выполняет преобразование этого значения.

Во многих языках некоторые приведения (обычно числовые) приводят к конверсиям (это может сильно отличаться в зависимости от языка), но в основном это просто "трактовать этот X как Y".

Как и большинство аспектов человеческого языка, к сожалению, термины используются в разных сообществах немного по-разному, в основном по языку. Например, см. Комментарий Джеймса ниже о C ++ & mdash; Слово «приведение» там имеет гораздо более широкое значение, чем приведенное выше определение, которое больше относится к форме C или Java. И просто для забавы, Java Language Spec на самом деле попадает в различные виды приведений, включая преобразований приведения . Но вышесказанное - хорошее эмпирическое правило.

А вот простой случай:

В Java до появления дженериков не было ничего необычного в том, чтобы при работе с картами делать лот типотипирования:

Map m = new HashMap();
m.put("one", "uno");

// This would give a compiler error, because although we know
// we'll get a String back, all the compiler knows is that it's
// an Object
String italian = m.get("one");

// This works, we're telling the compiler "trust me, it's a String"
String italian = (String)m.get("one");

К счастью, добавление generics решило эту проблему, поскольку приведение таким образом, как правило, является хрупким процессом с проблемами обслуживания.

Напротив, вы бы преобразовали , если бы у вас была строка цифр:

String s = "1234";

... и нужно было знать, какое число эти цифры представляют в десятичном виде:

// Wrong (cast)
int n = (int)s;

// Right (conversion)
int n = Integer.parseInt(s, 10);
9 голосов
/ 29 октября 2010

Может быть, поможет пример:

  • Если вы приведете 33 к строке, вы получите "!".
  • Если вы конвертируете 33 в строку, вы получите "33".

[Примечание: этот пример делает всевозможные необязательно допустимые предположения о кодировках и представлениях чисел и строк в памяти, но я надеюсь, что механизм понятен.]

9 голосов
/ 29 октября 2010

Для типирования достаточно взять перо и написать «this is int» в переменной, преобразование фактически преобразует содержимое в нужный тип, поэтому значение имеет смысл.

6 голосов
/ 29 октября 2010

Преобразование типов:

double value = 3; // implicit conversion to double value 3.0
int nValue = 3.14156; // implicit conversion to integer value 3

Приведение - это запрос программиста на явное преобразование типов.

int nValue = 10;
double dvalue = double(nValue); // explicit type casting
5 голосов
/ 29 октября 2010

Термины часто используются взаимозаменяемо.

Java

Приведение типов и преобразование типов - это одно и то же в Java, хотя, если кто-то говорит, что это приведение,они обычно ссылаются на явное преобразование.

Приведение в Java будет выполняться во время выполнения, поэтому может привести к сбою (сгенерировать исключение).Некоторые типы недопустимых приведений могут быть обнаружены во время компиляции.Когда приведение не выполняется, экземпляр помещается в ссылку object, поэтому компилятор не мог сказать, какое преобразование должно было быть выполнено, пока он фактически не запустил код.

C ++

Приведение типов и преобразование типов отличаются в C ++.В C ++ существует пять типов приведений, каждый из которых имеет различное поведение: static_cast, dynamic_cast, reinterpret_cast, const_cast и приведение в стиле c ((int)someVariable).

Некоторые C ++броски выполняют преобразование типов (следовательно, почему эта концепция вводит в заблуждение), вызывают код и потенциально выполняют проверки во время выполнения.Другие приведения C ++ просто подделывают изменение типа ссылающейся переменной - никакая память не будет изменена, перемещена или скопирована, поэтому результирующий тип данных может быть неправильно преобразован.Это может дать большую скорость во время выполнения и может быть мощным инструментом для низкоуровневого кода, но его следует избегать для высокоуровневого кода.

Обратите внимание, что синтаксис преобразования в стиле c (который выглядит точноподобно синтаксису Java) является одним из приведений, которые не обязательно будут вызывать код преобразования.

Преобразование типов в C ++ часто относится к вызову конструктора копирования или оператора присваивания, который копирует данные в новый экземпляр объекта.другой класс / структура.Если для типа определены операторы преобразования, то синтаксис преобразования может выглядеть как приведение или просто прямое присваивание.Основным отличием здесь является то, что код вызывается для преобразования.

4 голосов
/ 29 октября 2010

Согласно Википедии статья :

"В семействе языков C слово cast обычно относится к явному преобразованию типов (в отличие от неявного преобразования), независимо от того, является ли это повторной интерпретацией битового шаблона или действительным преобразованием."

Вот пример C ++:

double d = 42.0;
int i = d; // Here you have an implicit conversion from double to int
int j = static_cast<int>(d); // Here you have a cast (explicit conversion).

Вот пример Java (обратите внимание, что в Java, в отличие от C ++, вы не можете неявно конвертировать из double в int):

int i = 42;
double d = i; // Here you have an implicit conversion from int to double
int j = (int)d; // Here you have a cast (explicit conversion).
0 голосов
/ 13 июня 2019

Если вы концентрируетесь на Java и числовых типах, то, согласно Javadoc, я думаю, что основные различия между приведением типов и преобразованием типов:

  • без потери информации и точности (преобразование типов)
  • потеря точности (преобразование типа)
  • потеря информации (преобразование типа)

Чтобы рассмотреть более подробно, сначала (без потери информации и точности) преобразование может быть выполнено без информации и точностипотеря.Эти преобразования включают: byte в short, short в int, char в int, int в long, int в double и, наконец, с плавающей точкой в ​​удвоение.Например:

byte b = 2;
System.out.println(b); 
short s = b; // without information and precision loss (type conversion)
System.out.println(s);

результат:

    2
    2

Во-вторых (потеря точности), преобразование выполняется с потерей точности, это означает, что значение результата имеет правильную величину, однако с потерей точности,Эти преобразования включают: int, чтобы плавать, долго плавать и долго удваиваться.Например:

long l = 1234567891;
System.out.println(l); 
double d = l; // precision loss (type conversion)
System.out.println(d);

результат:

    1234567891
    1.234567891E9

В-третьих (потеря информации), преобразование выполняется через потерю информации, это означает, что вы приводите значения, поэтому оно имеет свои собственныесинтаксис.Эти преобразования включают: double в long, double to int и так далее.Например:

double d = 1.2;
System.out.println(d); 
long l = (long) d; // information loss
System.out.println(l);

результат (дробная часть опущена):

    1.2
    1
0 голосов
/ 14 января 2017

Из объекта в примитив -> Преобразование типов

String s = "1234";
int i = Integer.parseInt(s);
int j = Integer.valueOf(s);

Из примитива в объект -> Преобразование типов

int i = 55;
String s = String.valueOf(i);
String t = Integer.toString(i);

Из примитива в примитив (или объект в объект)-> Приведение типов (явное при сужении и неявное при расширении)

//explicit  
double d = 3.14156;
int i = (int)d; 
//implicit
int i = 100;
double d = i;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...