C++ 總結(jié)(三、語言特性)

C++ 總結(jié)(三、語言特性)

官網(wǎng)

本文總結(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é)一下補上)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容