目錄
C++的四種可視性類型轉換
1.static_cast
2.reinterpret_cast
3.const_cast
4.dynamic_cast
C++中的可調用對象
普通函數
函數指針
仿函數
Lambda表達式
包裝器function
bind
C++的四種可視性類型轉換
C語言中的類型轉換是不安全、不明確的,于是C++就出了更加安全,可視化的類型轉換。
1.static_cast
static_cast是用于C語言中可以隱式類型轉換的類型之間,當編譯器隱式執行類型轉換時,大多數編譯器會給出警告該操作會損失精度,而采用static_cast可以明確告訴編譯器,這是知情的情況下進行的。
使用static_cast
2.reinterpret_cast
reinterpret_cast用于C語言中某些不能隱式類型轉換的類型之間,例如:不同指針類型之間
使用reinterpret_cast
3.const_cast
const_cast用于const指針、引用->非const指針、引用之間的轉換
4.dynamic_cast
dynamic_cast是用于父類到子類之間指針、引用的轉換。默認子類對象、指針、引用可以賦值給父類(切片)
下面的情況就可以父類指針、引用賦值給子類指針、引用
改為:
這里使用了C語言中不同指針類型的強制類型轉換,本質是對指針可以訪問空間大小的改變
上面的例子中,Person* -> Student*的原因是它本來就是指向的一個Student,于是就可以從父類指針再回到子類指針。但是如果原本父類指針只是指向父類對象,強轉訪問會造成越界!
C++中使用dynamic_cast進行安全的向下轉型,如果轉型失敗會返回nullptr。從而有效避免越界。
C++中的可調用對象
普通函數
int a = 10, b = 20;
func(a, b);//普通函數
函數指針
int (*func_ptr)(int, int)=func;//函數指針
func_ptr(10, 20);
仿函數
class Func
{
public:int operator()(int a, int b){return a + b;}
};
int main()
{Func f;//仿函數f(10, 20);return 0;
}
Lambda表達式
//lambda表達式 [] 捕獲列表 ()參數列表 ->返回類型
auto flam=[](int a, int b)->int {return a + b;};
flam(10, 20);
包裝器function
包裝器是C++的一個模板類,可以將任何可調用對象賦值給包裝器對象,常用于業務邏輯的注冊。
//使用包裝器可以將任何可調用對象賦值給包裝器
function<int(int, int)> fun1 = func;
function<int(int, int)> fun2=func_ptr;
function<int(int, int)> fun3 = f;
function<int(int, int)> fun4 = flam;
包裝器玩法:
#include<functional>
#include<unordered_map>
int Add(int a, int b)
{return a + b;
}
int Sub(int a, int b)
{return a - b;
}
int Mul(int a, int b)
{return a * b;
}
int Div(int a, int b)
{if (b != 0)return a / b;elsereturn 0;
}
int main()
{unordered_map<string, function<int(int, int)>> business;//存儲業務邏輯business["+"] = Add;//將業務添加到business中business["-"] = Sub;business["*"] = Mul;business["/"] = Div;cout << business["+"](2, 3) << endl;//調用指定業務邏輯return 0;
}
bind
bind就像一個可調用對象適配器,通過接收一個可調用對象,生成一個新的可調用對象。
新的可調用對象可以原來的形參列表進行調整。
直接舉例示范:
甚至可以使參數在實際傳入時調換順序