C++ 總結(jié)(三欢顷、語言特性)
本文總結(jié) C++ 語言本身的一些功能特性劝堪。
類型轉(zhuǎn)換 Type conversions
類型轉(zhuǎn)換主要包含 隱式轉(zhuǎn)換 和 顯示轉(zhuǎn)換
隱式轉(zhuǎn)換
隱式轉(zhuǎn)換: 主要是值傳遞,將被轉(zhuǎn)換的變量值copy一份弹囚,賦值給目標(biāo)變量厨相。
隱式轉(zhuǎn)換用于基礎(chǔ)數(shù)據(jù)類型轉(zhuǎn)換,例如: short -> int 或者 Float -> double 這種低精度轉(zhuǎn)換為高精度可以正常轉(zhuǎn)換。但是也存在一些例外情況蛮穿,如:
- 負(fù)整數(shù)轉(zhuǎn)換成無符號整數(shù)庶骄。因為計算機采用補碼形式,所以 -1 會直接轉(zhuǎn)換為最大整數(shù)践磅。
- bool 值 false = 0 或者 nullPtr单刁, true 則可以轉(zhuǎn)換為任意非0指針
- 高精度轉(zhuǎn)低精度,如 double -> int 會導(dǎo)致小數(shù)部分精度丟失音诈,如果整數(shù)部分依舊無法存儲在 int 中幻碱,會導(dǎo)致未知行為(高位溢出)
隱式轉(zhuǎn)換用于非基礎(chǔ)類型: 如 數(shù)組 和 函數(shù) 轉(zhuǎn)換為指針,通常遵守如下規(guī)則
- 空指針 nullPtr 可以轉(zhuǎn)換為任意類型的指針
- 任意類型的指針细溅,可以轉(zhuǎn)換為 void *
- 指針轉(zhuǎn)換褥傍,可以將指向子類的指針,直接指向具體基類喇聊。
類 之間的隱式轉(zhuǎn)換
類也可以進行隱式轉(zhuǎn)換恍风,主要情況有: 單參數(shù)構(gòu)造轉(zhuǎn)換
、賦值轉(zhuǎn)換
誓篱、轉(zhuǎn)換為其他類型
- 單參數(shù)構(gòu)造轉(zhuǎn)換: 允許通過其他類型作為參數(shù)朋贬,通過構(gòu)造函數(shù)轉(zhuǎn)換
- 賦值操作符: 允許賦值的時候轉(zhuǎn)換為特定類型
- 類型轉(zhuǎn)換運算符: 允許轉(zhuǎn)換為特定類型。
具體示例如下
// implicit conversion of classes:
#include <iostream>
using namespace std;
class A {};
class B {
public:
// conversion from A (constructor):
B (const A& x) {}
// conversion from A (assignment):
B& operator= (const A& x) {return *this;}
// conversion to A (type-cast operator)
operator A() {return A();}
};
int main ()
{
A foo;
B bar = foo; // calls constructor
bar = foo; // calls assignment
foo = bar; // calls type-cast operator
return 0;
}
explicit 關(guān)鍵字
explicit 關(guān)鍵字作用于:可以類型轉(zhuǎn)換的成員函數(shù)窜骄。明確指示該函數(shù)可以用非自己類型的類實例來構(gòu)造當(dāng)前實例锦募。
// explicit:
#include <iostream>
using namespace std;
class A {};
class B {
public:
// 對于此構(gòu)造函數(shù),其參數(shù)可以為其他類型. 可以使用 explicit 來修飾
explicit B (const A& x) {}
B& operator= (const A& x) {return *this;}
operator A() {return A();}
};
void fn (B x) {}
int main ()
{
A foo;
B bar (foo); // 單參數(shù)構(gòu)造
bar = foo; // 賦值隱式轉(zhuǎn)換
foo = bar; // 類型轉(zhuǎn)換給被賦值的參數(shù)
// fn (foo); // not allowed for explicit ctor.
fn (bar);
// B bar = foo; // 不允許使用賦值構(gòu)造函數(shù)語法邻遏。
return 0;
}
Type casting
C++ 是一種強類型語言糠亩,類型之間轉(zhuǎn)換有兩種形式: 函數(shù)式轉(zhuǎn)換、類C語言轉(zhuǎn)換准验。
double x = 10.3;
int y;
y = int (x); // functional notation
y = (int) x; // c-like cast notation
兩種轉(zhuǎn)換語法足以應(yīng)對大多數(shù)類型轉(zhuǎn)換赎线,但是不加節(jié)制的使用以上語法,雖然語法正確糊饱,但是可能會造成運行時錯誤垂寥。如將A類指針,強行轉(zhuǎn)換為B類指針另锋,然后調(diào)用B類的方法滞项。
C++ 類型轉(zhuǎn)換提供了四種類型轉(zhuǎn)換限制,它們本質(zhì)上同于函數(shù)式
和類C語言
轉(zhuǎn)換砰蠢,但各自有特點:
- dynamic_cast <new_type> (expression)
- reinterpret_cast <new_type> (expression)
- static_cast <new_type> (expression)
- const_cast <new_type> (expression)
dynamic_cast 動態(tài)轉(zhuǎn)換:
會根據(jù)運行時信息確認(rèn)真實的類型蓖扑,如果轉(zhuǎn)換成功,新類型指針有值台舱,轉(zhuǎn)換失敗律杠,新類型指針變成 nill ptr
static_cast 靜態(tài)轉(zhuǎn)換:
--- 未完待續(xù) (留個坑潭流,后面補上。把C++ 官網(wǎng)整體總結(jié)一下補上)