C Primer筆記2 四種型別轉換 異常機制

2021-09-08 04:31:34 字數 2918 閱讀 5676

1.型別轉換

命名的強制型別轉換:

有static_cast、dynamic_cast、const_cast、reinterpret_cast

static_cast:

編譯器隱式執行的不論什麼型別轉換都能夠由static_cast完畢

當乙個較大的算術型別賦值給較小的型別時。能夠用static_cast進行強制轉換。

能夠將void*指標轉換為某一型別的指標

能夠將基類指標強制轉換為派生類指標,可是不安全。

無法將const轉化為nonconst。這個僅僅有const_cast才幹夠辦得到

舉例:

double d = static_cast(j) / i;

void *p = &d;

double *dp = static_cast(p);

const_cast:

用來移除物件的常量性(cast away the constness), 

const_cast一般用於指標或者引用。

對於將常量物件轉換為很常量物件的行為,一旦去掉了const性質。編譯器就不再阻止我們對該物件的寫操作,結果是沒有定義的。

const char *pc;

char *p = const_cast(pc);//正確:可是通過p寫值是沒有定義的行為;

char *p = static_cast(pc);//錯誤。static_cast不能轉換掉const性質

static_cast(pc);//正確。字串字面值轉換為string

const_cast(pc);//錯誤,const_cast僅僅改變常量屬性

#include using namespace std;

int main(void)

發現通過const_cast轉換後,去除了const屬性,然後對變數改動,執行時記憶體中的值是改變的,但最後列印改動後的值仍為原樣。

以下是網上摘錄的一段解釋:

const僅僅是告訴編譯器不能改動而不是真正地不可改動,假設程式猿不注意而去改動了它會報錯。如今我們利用const_cast去除了常量性,然後通過指標和引用對其進行了改動,所以通過指標列印或者引用傳參的時候就能看出其記憶體確實變化了,但為了保護val這個變數本來的const特性,所以每次我們使用val時。系統都將其替換成初始值100,確保了val還是「不可變」的

reinterpret_cast

常為運算物件的位模式提供較低層次上的又一次解釋。

舉例:

int *pi;

char *pc = reinterpret_cast(pi);

我們必須牢記pc所指的真實物件是乙個int而非字元,假設把pc當成字元指標在執行時可能出錯。

如:string str(pc);

使用reinterpret_cast時很危急的,一般避免使用。

dynamic_cast:

dynamic_cast主要用於類層次間的上行轉換和下行轉換,還能夠用於類之間的交叉轉換。

在類層次間進行上行轉換時。dynamic_cast和

static_cast

的效果是一樣的。

在進行下行轉換時。dynamic_cast具有型別檢查的功能,比

static_cast

更安全。

1. 安全的基類和子類之間轉換。

2. 必需要有虛函式。

3. 同樣基類不同子類之間的交叉轉換。但結果是null。

樣例:

#include using namespace std;

class a

virtual void getn(){}

};class b : public a

virtual void getn()

void printf()

};void test(a * pa)

int main()

總結:去掉const屬性用const_cast

主要的型別轉換用static_cast

多型類之間的型別轉換用dynamic_cast

不同型別指標型別轉換用reinterpret_cast

參考:

2.異常機制

try-catch-throw的使用:

#include using namespace std;

double fun(int a, int b)

return a/b;

}int main()

catch(int)

catch(...)

cout << "a: " << a << endl;//still run after deal exception

return 0;

}

自己定義異常類:

#include using namespace std;

class myexception

~myexception()

void mythrow()

private:

string name;

};int main()

catch(...)

return 0;

}

執行結果:

new exception: test

new exception: error

*****

delete exception: error

delete exception: test

NAT 四種型別

nat主要分為兩大類 錐型 cone 和對稱型 symmetric 1.為什麼需要nat nat緩解了ipv4位址不夠用的問題,同時也也帶了限制,那就是nat外部的主機無法主動跟位於nat內部的主機通訊,nat內部主機想要通訊,必須主動和公網的乙個ip通訊,路由器負責建立乙個對映關係,從而實現資料的...

四種型別轉換

c 中四種型別轉換是 static cast,dynamic cast,const cast,reinterpret cast 1 const cast 用於將const變數轉為非const 2 static cast 用於各種隱式轉換,比如非const轉const,void 轉指標等,static...

NAT 的四種型別

總結 1,四種型別都需要內部主機先向外發起一次通訊後,外部主機才可以和內部主機通訊。在nat打了個洞 2,前三種型別所有的通訊只通過同乙個外部tuple ip port 2.1,第一種型別允許任意主機通過任意埠通過這個外部tuple和內部主機通訊 2.2,第二種型別允許曾經通訊過 打洞時 的外部主機...