C 基礎學習第十六課 新特性

2021-10-22 16:24:43 字數 3694 閱讀 5921

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 級別編號 當前等級需要輸入的次數 當前等級...