什麼是類型轉換什麼是類型鑄造?C++中的類型轉換/ Casting混淆
什麼時候應該使用它們中的每一個?
細節:對不起,如果這是一個明顯的問題;我是C++新手,來自紅寶石背景,用於to_s
和to_i
等。
什麼是類型轉換什麼是類型鑄造?C++中的類型轉換/ Casting混淆
什麼時候應該使用它們中的每一個?
細節:對不起,如果這是一個明顯的問題;我是C++新手,來自紅寶石背景,用於to_s
和to_i
等。
轉換是當值這個,轉換成不同的類型。結果是目標類型的值,並且有哪些輸出值來自(源類型的)輸入的結果。
例如:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
結果是unsigned int
值等於i
模UINT_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
傳統鑄造(類似於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
在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_cast
,const_cast
,reinterpret_cast
和dynamic_cast
,也是C-style cast
類型轉換時,你實際上是在另一種類型的轉換類型,例如一個字符串轉換成整數,副-versa,類型轉換是當內存的實際內容沒有改變時,但編譯器以不同的方式解釋它。
類型轉換表明您正在處理不同的內存塊。
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.
+1,但應該注意的是,這個術語沒有嚴格遵守。考慮一下`int i;浮動f = static_cast(i)` - 通過你的邏輯(我同意),這是一個*轉換*,而不是演員。 C++仍然使用`static_cast`(是的,我知道隱式轉換可以在這裏工作)。換句話說:你已經給出了兩個術語在語義上最有意義的區別。但是C++並沒有遵循這個區別。 –
2010-12-02 16:38:24
編輯澄清一些事情,希望我不會傳播錯誤信息。 – 2010-12-02 16:45:26