C++ 總結(jié)(三、語言特性)
本文總結(jié) C++ 語言本身的一些功能特性。
類型轉(zhuǎn)換 Type conversions
類型轉(zhuǎn)換主要包含 隱式轉(zhuǎn)換 和 顯示轉(zhuǎn)換
隱式轉(zhuǎn)換
隱式轉(zhuǎn)換: 主要是值傳遞,將被轉(zhuǎn)換的變量值copy一份,賦值給目標變量。
隱式轉(zhuǎn)換用于基礎數(shù)據(jù)類型轉(zhuǎn)換,例如: short -> int 或者 Float -> double 這種低精度轉(zhuǎn)換為高精度可以正常轉(zhuǎn)換。但是也存在一些例外情況,如:
- 負整數(shù)轉(zhuǎn)換成無符號整數(shù)。因為計算機采用補碼形式,所以 -1 會直接轉(zhuǎn)換為最大整數(shù)。
- bool 值 false = 0 或者 nullPtr, true 則可以轉(zhuǎn)換為任意非0指針
- 高精度轉(zhuǎn)低精度,如 double -> int 會導致小數(shù)部分精度丟失,如果整數(shù)部分依舊無法存儲在 int 中,會導致未知行為(高位溢出)
隱式轉(zhuǎn)換用于非基礎類型: 如 數(shù)組 和 函數(shù) 轉(zhuǎn)換為指針,通常遵守如下規(guī)則
- 空指針 nullPtr 可以轉(zhuǎn)換為任意類型的指針
- 任意類型的指針,可以轉(zhuǎn)換為 void *
- 指針轉(zhuǎn)換,可以將指向子類的指針,直接指向具體基類。
類 之間的隱式轉(zhuǎn)換
類也可以進行隱式轉(zhuǎn)換,主要情況有: 單參數(shù)構造轉(zhuǎn)換、賦值轉(zhuǎn)換、轉(zhuǎn)換為其他類型
- 單參數(shù)構造轉(zhuǎn)換: 允許通過其他類型作為參數(shù),通過構造函數(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 關鍵字
explicit 關鍵字作用于:可以類型轉(zhuǎn)換的成員函數(shù)。明確指示該函數(shù)可以用非自己類型的類實例來構造當前實例。
// explicit:
#include <iostream>
using namespace std;
class A {};
class B {
public:
// 對于此構造函數(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ù)構造
bar = foo; // 賦值隱式轉(zhuǎn)換
foo = bar; // 類型轉(zhuǎn)換給被賦值的參數(shù)
// fn (foo); // not allowed for explicit ctor.
fn (bar);
// B bar = foo; // 不允許使用賦值構造函數(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)換語法足以應對大多數(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ù)運行時信息確認真實的類型,如果轉(zhuǎn)換成功,新類型指針有值,轉(zhuǎn)換失敗,新類型指針變成 nill ptr
static_cast 靜態(tài)轉(zhuǎn)換:
--- 未完待續(xù) (留個坑,后面補上。把C++ 官網(wǎng)整體總結(jié)一下補上)