2010-12-02 61 views
11

什麼是類型轉換什麼是類型鑄造C++中的類型轉換/ Casting混淆

什麼時候應該使用它們中的每一個?

細節:對不起,如果這是一個明顯的問題;我是C++新手,來自紅寶石背景,用於to_sto_i等。

回答

15

轉換是當值這個,轉換成不同的類型。結果是目標類型的值,並且有哪些輸出值來自(源類型的)輸入的結果。

例如:

int i = 3; 
unsigned int j; 
j = i; // the value of "i" is converted to "unsigned int". 

結果是unsigned int值等於iUINT_MAX+1,並且這個規則是語言的一部分。因此,在這種情況下,值(英文)仍然是「3」,但它的無符號整型值爲3,與有符號整數值3略有不同。

請注意,轉換是自動發生的,我們只是在需要unsigned int值的位置使用帶符號的int值,並且該語言定義了實際上沒有我們轉換的含義。這就是所謂的「隱式轉換」。

鑄造」是一個明確的轉換。

例如:

unsigned int k = (unsigned int)i; 
long l = long(i); 
unsigned int m = static_cast<unsigned int>(i); 

都轉換。具體而言,根據該標準的5.4/2,k使用cast-expression,並且根據5.2.3/1,l使用相同的事物(除了我已經使用了不同的類型)。 m使用「類型轉換操作符」(static_cast),但該標準的其他部分也將其稱爲「類型轉換」。

用戶定義的類型可以定義「轉換函數」,其爲您的類型轉換爲另一種類型的提供特定的規則,以及單參數構造在轉換中使用過:

struct Foo { 
    int a; 
    Foo(int b) : a(b) {}     // single-arg constructor 
    Foo(int b, int c) : a(b+c) {}   // two-arg constructor 
    operator float() { return float(a); } // conversion function 
}; 

Foo f(3,4);    // two-arg constructor 
f = static_cast<Foo>(4); // conversion: single-arg constructor is called 
float g = f;    // conversion: conversion function is called 
3

傳統鑄造(類似於C中的(Bar)foo,在C++中使用,reinterpret_cast<>)是當變量的實際內存內容被假定爲不同類型的變量時。類型轉換(即Boost的lexical_cast<>或其他用戶定義的函數轉換類型)是當一些邏輯被執行到實際時轉換變量從一個類型到另一個類型,如整數到字符串,其中一些代碼運行以邏輯形式字符串超出給定的整數。

還有靜態和動態轉換,用於繼承,例如強制使用子類型的父成員函數(dynamic_cast<>),反之亦然(static_cast<>)。靜態鑄造,您還可以執行典型的「隱含的」類型發生,當你這樣做的轉換:

 
float f = 3.14; 
int i = f; //float converted to int by dropping the fraction 

可以改寫爲:

 
float f = 3.14; 
int i = static_cast<int>(f); //same thing 
+2

+1,但應該注意的是,這個術語沒有嚴格遵守。考慮一下`int i;浮動f = static_cast (i)` - 通過你的邏輯(我同意),這是一個*轉換*,而不是演員。 C++仍然使用`static_cast`(是的,我知道隱式轉換可以在這裏工作)。換句話說:你已經給出了兩個術語在語義上最有意義的區別。但是C++並沒有遵循這個區別。 – 2010-12-02 16:38:24

+1

編輯澄清一些事情,希望我不會傳播錯誤信息。 – 2010-12-02 16:45:26

2

在C++中,任何表達具有一種。當您在需要其他類型的值的上下文中使用一種類型的表達式(如類型D)時,編譯器會嘗試將表達式從類型S轉換爲類型D.如果這種隱式轉換不會不存在,這會導致錯誤。單詞類型轉換不是標準的,但與轉換相同。

E.G.

void f(int x){} 

char c; 

f(c); //c is converted from char to int. 

轉換是排名的,你可以谷歌爲promotions vs. conversions瞭解更多詳情。

有5個顯式類型轉換操作符在C++ static_castconst_castreinterpret_castdynamic_cast,也是C-style cast

2

類型轉換時,你實際上是在另一種類型的轉換類型,例如一個字符串轉換成整數,副-versa,類型轉換是當內存的實際內容沒有改變時,但編譯器以不同的方式解釋它。

0

類型轉換表明您正在處理不同的內存塊。

int i = 10; 
int* ip = &i; 
char* cp = reinterpret_cast<char*>(ip); 
if (*cp == 10) // Here, you are treating memory that was declared 
{     // as int to be char. 
} 

類型轉換表示您將值從一種類型轉換爲另一種類型。

char c = 'A'; 
int i = c; // This coverts a char to an int. 
      // Memory used for c is independent of memory 
      // used for i.