c風格的強制轉換(type cast)容易理解,不管什麼型別的轉換都可以使用使用下面的方式。
typename b = (typename)a;
規則:當然c++也是支援c風格的強制轉換,但是c風格的強制轉換可能帶來一些隱患,讓一些問題難以察覺。所以c++提供了一組可以用在不同場合的強制轉換的函式。
在c++語言中新增了四個關鍵字const_cast、static_cast、dynamic_cast和reinterpret_cast。這四個關鍵字都是用於強制型別轉換的。
新型別的強制轉換可以提供更好的控制強制轉換過程,允許控制各種不同種類的強制轉換。
c++中風格是static_cast(content)。c++風格的強制轉換其他的好處是,它們能更清晰的表明它們要幹什麼。程式設計師只要掃一眼這樣的**,就能立即知道乙個強制轉換的目的。
2.1)const_cast:
在c語言中,const限定符通常被用來限定變數,用於表示該變數的值不能被修改。
而const_cast則正是用於強制去掉這種不能被修改的常數特性,但需要特別注意的是const_cast不是用於去除變數的常量性,而是去除指向常數物件的指標或引用的常量性,其去除常量性的物件必須為指標或引用。
我們看乙個錯誤的例子:
#include using namespace std;
int main()
正確示例:
#include using namespace std;
int main()
}return nullptr;
}int main() ;
int val = 4;
int* p = const_cast(search(a,5,val));
if (p == nullptr)
}return null;
}int main() ;
int val = 4;
int& p = const_cast(search(a,5,val));
if (p == null)
/*ptr_addr 的值(hex): 0061e6d8
*/
2.4)dynamic_cast:
dynamic_cast是執行時處理的,執行時要進行型別檢查,其他三種都是編譯時完成的。在c++中,編譯期的型別轉換有可能會在執行時出現錯誤,特別是涉及到類物件的指標或引用操作時,更容易產生錯誤。dynamic_cast操作符則可以在執行期對可能產生問題的型別轉換進行測試。
規則:
#includeusing namespace std;
class base
virtual void i_am_virtual_foo() {}
};class sub: public base
virtual void i_am_virtual_foo() {}
};int main()
cout << "base> sub2base val is: " << sub2base << endl;
//base->sub
base *base = new base();
base->print();
sub *base2sub = dynamic_cast(base);
if (base2sub != nullptr)
cout <<"sub> base2sub val is: "<< base2sub << endl;
delete sub;
delete base;
return 0;
}
輸出:
i'm sub
i'm base
base> sub2base val is: 00b9e080
i'm base
sub> base2sub val is: 00000000
分析:在我們可以將由子類上轉型父類的物件,再下轉型成子類物件。
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...
C 四種強制型別轉換
1 概述 去const屬性用const cast。基本型別轉換用static cast。多型類之間的型別轉換用daynamic cast。不同型別的指標型別轉換用reinterpreter cast。2 詳解加示例 a const cast 用法 const cast 型別 表示式 用途 刪除con...
C 四種強制型別轉換
c風格的強制型別轉換 type cast 很簡單,不管什麼型別的轉換統統是 type b type a c 風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。const cast,字面上理解就是去const屬性。static cast,命名上理解是靜態型別轉換。如int轉換成char。dy...