c++11/14/17標準
1,強制轉換
c語言使用type b=(type)a的形式進行強制轉換.但是有缺點:萬物皆可轉,不易區分;
c++提供了四種型別轉換操作符用來在不同場合進行強制轉換;
型別轉換操作符
作用static_cast
靜態型別轉換,編譯器做型別檢查,基本型別能轉換,指標不行;
reinter_cast
重新解釋型別;
const_cast
去掉const屬性;
dynamic_cast
動態型別轉換,執行時檢查型別安全,(轉換失敗返回nullptr),如子類和父類之間的多型型別轉換;
1,static_cast 類似c語言的強制轉換,進行無條件轉換,靜態型別轉換;
`基本資料型別轉換,enum,struct,int,char,float等.static_cast不能進行無關型別(如非基類和子類)指標之間的轉換.
`可以用於void*和其他指標型別之間的轉換(但是不能用於非void指標之間的轉換);
int*p=nullptr;
int n=static_cast(p);//error
2,reinterpret_cast 轉換的型別必須是乙個指標;
`不同型別指標之間的轉換;
`int轉為指標,指標轉為int;
3,const_cast:可以去掉const常量的屬性;
const int s=999;
//s=0;//error
int& x=const_cast(s);
x=80;//true
4,dynamic_cast:動態型別識別,判斷父類指向的是哪乙個子類物件;
`指標:轉換失敗返回nullptr;
`引用:轉換失敗拋std::bad_cast異常;
2,去轉義字元
在字串前加上r,並用()把字串的資料報括起來;
案例:
char s="d:\fssf\dfa";//會發生轉義
char d=r"(d:\fdf\gfg)";//不會發生轉義;
3,decltype型別指導
decltype關鍵字,和auto的功能相同,都用來在編譯時期進行自動型別指導;
decltype是"declare type"的縮寫,翻譯為"宣告型別"
;
區別:
auto varname=value;
decltype(exp) varmame=value;
//varname 表示變數名,value表示賦給變數的值,exp表示乙個表示式;
注意:
auto是根據=右邊的初始值value推導出變數的型別,而decltype根據exp表示式推導出變數的型別,跟=右邊的value沒有關係;因此,auto要求變數必須初始化,而decltype不要求;
exp的注意事項:不能是void;
使用範例:
int n=0;
decltype(n) m=3;//m被推導成了int;
decltype(1.3) u=3.54;//u被推導成了double;
decltype(u+99) f;//f被推導成了double;
4,decltype推導規則
當使用decltype(exp)獲取型別時,編譯器將根據三條規則得出結果:
1,如果exp是乙個不被括號()包圍的表示式,那麼decltype(exp)的型別就和exp一致;
2,如果exp是函式呼叫,那麼decltype(exp)的型別就和函式返回值的型別一致;
3,如果exp是乙個左值,或者被括號()包圍,那麼decltype(exp)的型別就是exp的引用,假設exp的型別為m,那麼decltype(exp)的型別就是m&;
//函式宣告
int fun_int(int);
int* fun_int_ptr(int);
int& fun_int_ref(int);
const int& fun_cint_ref(int);
int main()
注意:exp中呼叫函式時需要帶上括號和引數,但僅僅是形式,不會真正的執行函式**;
5,返回值型別後置int& foo(int& s)
float foo(float& x)
templateauto fun(t& va)->decltype(foo(va))//使用->就可以返回想要返回的型別,這裡是讓其自動返回
int main()
6,lambda匿名函式
1,定義:
[外部變數訪問方式說明符](引數)mutable noexcept -> 返回值型別
;`[外部變數訪問方式說明符]:
方括號用於向編譯器表示當前是乙個lambda表示式,其不能省略,在方括號內部,可以註明當前lambda函式的函式體中可以使用哪些外部變數;
外部變數:指的是和當前lambda表示式位於同一作用域的所有區域性變數;
`(引數):
和普通函式定義一樣,lambda匿名函式也可以接收外部傳遞的多個引數,和普通函式不同的是,如果不需要傳遞引數,可以連同()小括號一起省略;
`mutable:
可選,如果使用則之前的()小括號不能省略(引數個數可以為0),預設情況下,對於以值傳遞方式引入的外部變數,不允許在lambda表示式內部修改它們的值(可以理解為這部分變數都是const常量),而如果想要修改它們,就必須使用mutable關鍵字;
`noexcept:
可選,如果使用,在之前的()小括號將不能省略(引數個數可以為0),預設情況下,lambda函式的函式體中可以丟擲任何型別的異常,而標註noexcept關鍵字,則表示函式體內不會丟擲任何異常;
案例1:
//= 以值的方式捕獲,而且在函式的內部不可以修改變數的值,自動加了const;
//可以在後面加上mutable,可以在函式內部修改外部變數,但外部變數的值不變;
int a = 4;
auto fun=[=]() mutable
; fun(); //11
cout << a;//4
案例2:
//& 以引用的方式捕獲,可以修改外部變數的值,而且會改變外部變數的值;
int a = 4;
auto fun = [&]()
; fun();//99
cout << a;//99
7,完美**
template
c++引入模板函式forward(),呼叫該函式可以將函式模板接收到的形參連同其右,左屬性一起傳遞給被呼叫的函式;
案例:
void otherfun(int& a)
void otherfun(const int& a)
templateauto fun(t&& bal)
//auto fun(t bal)
//int main()
注意:1,當實參為左值或者左值引用(a&)時,函式模板中t&&轉變為a&(a& && =a&);
1,當實參為右值或者右值引用(a&&)時,函式模板中t&&將轉變為a&&(a&& &&=a&&);
python基礎第十六課 函式
為什麼需要函式 def 函式名 輸入引數 函式體 return result 函式名 實際引數 def calc a,b c a b return c result calc 10,20 print result 30 關鍵字實參 def calc a,b a和b稱為形式引數,簡稱形參 c a b ...
異常 CLR學習第十六課
一 try catch 中的catch丟擲異常必須是更具體的異常處理類,像父級異常處理拋 出。就是說exception應該是最後乙個丟擲的異常。在exception丟擲異常後,其後的 異常將不處理。二 盡可能的不要把可能出現異常的 塊方法哦,finally中,即使finally出現異 常,系統的異常...
第十六課 QuickHit分析
第十六課 quickhit分析 乙個簡單的輸入闖關遊戲 一 問題1 發現類和物件 1.遊戲類game 方法 生成當前關卡字串 結果判斷和輸出 2.玩家類player 屬性 當前級別 當前的積分 當前級別開始時間 當前級別已用時間 玩遊戲3.等級類level 級別編號 當前等級需要輸入的次數 當前等級...