程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++類型轉換歸結總結

C++類型轉換歸結總結

編輯:關於C++

C++類型轉換歸結總結。本站提示廣大學習愛好者:(C++類型轉換歸結總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++類型轉換歸結總結正文


學過C++的人都曉得,C++是強類型說話,是以變量在應用前就要聲明數據類型,分歧數據類型分派的內存空間年夜小也是分歧,在轉換類型時特別須要留意這個成績,以避免數據喪失或越界溢出。本文將具體歸結總結一下C++的類型轉換。

C++從C成長而來,也繼續兩種C作風的轉換:隱式轉換和顯式轉換。

1.隱式轉換

隱式轉換是指由編譯體系主動停止,不須要人工干涉的類型轉換,例如:

short a = 2000;
int b;
b = a;

隱式轉換,也包含結構函數和運算符的轉換,例如:

class A {};
class B {
public: 
  B (A a) {}
};

 
A a;
B b = a;

2.顯式轉換

和隱式轉換相反,顯式轉換要應用強迫類型轉換運算符停止轉換,例如:

double x = 10.3;
int y;
y = int (x);  // 函數式寫法
y = (int) x;  // C作風寫法

以上類型轉換曾經知足了根本類型的轉換了。然則假如想轉換類和指針,有時期碼可以編譯,在運轉進程中會失足。例如:

#include <iostream>

class CDummy {
  float i,j;
public:
  CDummy () { i=1; j=1; }
};

class CAddition {
  int x,y;
public:
  CAddition () { x=1; y=1; }
  int result() { return x+y;}
};

int main () {
 CDummy d;
 CAddition * padd;
 padd = (CAddition*) &d;
 std::cout << padd->result();
 return 0;
}

這段代碼會在運轉期失足,在履行padd->result()時產生異常,有些編譯器會異常加入。
傳統明白的類型轉換,可以轉換成任何其他指針類型任何指針,它們指向的類型有關。在隨後的挪用成員的成果,會發生一個運轉時毛病或不測的成果。

C++尺度轉換運算符

傳統的類和指針的類型轉換方法很不平安,能夠會在運轉時異常加入,尺度C++ 供給了四個轉換運算符:dynamic_cast、reinterpret_cast、static_cast、 const_cast
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)

1.dynamic_cast

dynamic_cast只能用於指針和援用的對象。其目標是確保類型轉換的成果是一個有用的完成所要求的類的對象,所以當我們從一個類轉換到這個類的父類,dynamic_cast老是可以勝利。dynamic_cast可以轉換NULL指針為不相干的類,也能夠任何類型的指針為void指針。

class CBase { };
class CDerived: public CBase { };
CBase b;
CDerived d;

CBase* pb = dynamic_cast<CBase*>(&d);    // 子類轉父類,准確
//CDerived* pd = dynamic_cast<CDerived*>(&b); // 父類轉子類,毛病

當新的類型不是被轉換的類型的父類,dynamic_cast沒法完成指針的轉換,前往NULL。當dynamic_cast轉換援用類型時,碰到掉敗會拋出Bad_cast 異常。

2.static_cast

static_cast可以履行相干的類的指針之間的轉換,可以在子類和父類之間互相轉換,但父類指針轉成子類指針是不平安的。static_cast沒有在運轉時停止平安檢討,是以我們要先確保轉換是平安的。另外一方面,static_cast比較dynamic_cast少了在類型平安檢討的開支。

class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast<CDerived*>(a);

上述代碼是正當的,b指向一個不完全的對象,能夠在運轉期招致毛病。
static_cast也能夠用來履行任何其他非指針的轉換,如根本類型enum, struct, int, char, float等之間的尺度轉換:

double d = 3.14159265;
int i = static_cast<int>(d); 
void* p = static_cast<void*>(&i); //隨意率性類型轉換成void類型

3.reinterpret_cast

reinterpret_cast轉換成任何其他指針類型,乃至有關的類,任何指針類型。操作的成果是從新說明類型,但沒有停止二進制的轉換。一切的指針轉換是許可的:不論是指針指向的內容照樣指針自己的類型。

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B*>(a)

reinterpret_cast還可以用來轉換函數指針類型,例如:

typedef void(*Func)();         // 聲明一種函數指針界說,前往void
Func pFunc;              // 界說FuncPtr類型的數組

//pFunc = &test;             // 編譯毛病!類型不婚配
pFunc = reinterpret_cast<Func>(&test); // 編譯勝利!轉換函數指針類型

4.const_cast

const_cast用於把持對象的常量性,去失落類型的const或volatile屬性。

#include <iostream>

void print (char * str){
 std::cout << str ;
}

int main () {
 const char* c = "hello world";
 print ( const_cast<char *> (c) );
 return 0;
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved