C 補充及C 11特性

2021-10-05 11:39:42 字數 3990 閱讀 1882

三、c++11新特性變參模板、完美**和emplace

explicit關鍵字,作用時表面該建構函式是顯式的不能進行隱式的轉換。

#include

#include

using

namespace std;

class

human

human

(int age, string name)

private

:int age;

string name;};

intmain()

;//隱式構造 初始化引數列表,c++11 前編譯不能通過,c++11新增特性(√)

return0;

}

什麼是隱式構造,隱式構造?

舉例說明:

human h1(18);//顯式構造

human h2=18;//隱式構造,當加了explicit後構造這樣的物件會報錯。

human h3=;

總結:加explict關鍵字是為了避免分歧,只使用顯式構造會讓人更加容易看懂**。

引用的本質是常量指標

隱式轉換以及強制型別轉換

舉例說明:

double a=3.14159;

int i=a; //隱式轉換

int i1=(int)a; //強制型別轉換

c++風格的型別轉換提供了4種型別轉換操作符來應對不同場合的應用。

格式:type b = 型別操作符( a )

型別操作符= static_cast | reinterpreter_cast | dynamic_cast | const_cast

①:static_cast(比較溫和,類似傳統型別轉換的隱式轉換,在編譯的時候會進行檢測,離譜的轉換不行)

static_cast(i);

對type沒什麼型別的要求

主要用法:

用於類層次結構中基類(父類)和派生類(子類)之間指標或引用的轉換。上行 指標或引用(派生類到基類)轉換安全,下行不安全

用於基本資料型別之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

把空指標轉換成目標型別的空指標。把任何型別的表示式轉換成void型別。

#include

using

namespace std;

class

human};

class

boy:

public human};

intmain()

②reinterpret_cast重新解釋型別(掛羊頭,賣狗肉) 不同型別間的互轉,數值與指標間的互轉

能用其他的型別轉換就用其他的,這種型別轉換類似c中的強轉

用法: type b = reinterpret_cast ( a )

type必須是乙個指標、引用、算術型別、函式指標.

忠告:濫用 reinterpret_cast 運算子可能很容易帶來風險。 除非所需轉換本身是低階別的,否則應使用其他強制轉換運算子之一(如果記憶體空間的大小一樣那沒有什麼大的風險)

#include

using

namespace std;

class

animal};

class

dog:

public animal};

class

cat:

public animal};

intmain

(void

)

③dynamic_cast動態轉換

將乙個基類物件指標cast到繼承類指標,dynamic_cast 會根據基類指標是否真正指向繼承類指標來做相應處理。失敗返回null,成功返回正常cast後的物件指標;

將乙個基類物件引用cast 繼承類物件,dynamic_cast 會根據基類物件是否真正屬於繼承類來做相應處理。失敗丟擲異常bad_cast

用dynamic_cast的場景一般都是找出父類指標指向的是哪個繼承類,一般父類是存在虛函式的,要不然沒有的話感覺其實dynamic_cast感覺就沒什麼用處了。看下面**?

#include

using

namespace std;

class

animal

;class

cat:

public animal

void

play()

};class

dog:

public animal

void

play()

};//引用的型別

void

animalplay

(animal& animal)

catch

(std::bad_cast bc)

trycatch

(std::bad_cast bc)

}//指標的型別

void

animalplay

(animal* animal)

else

cat* pcat =

dynamic_cast

>

(animal);if

(pcat)

else

}int

main

(void

)

④const_cast

去const屬性,僅針對指標和引用

#include

using

namespace std;

void

demo

(const

char

* p)

void

demo

(const

int& a)

intmain()

概括:

1.static_cast靜態型別轉換,編譯的時c++編譯器會做編譯時的型別檢查;隱式轉換;基本型別轉換,父子類之間合理轉換

2.若不同型別之間,進行強制型別轉換,用reinterpret_cast<>() 進行重新解釋

3.dynamic_cast<>(),動態型別轉換,安全的虛基類和子類之間轉換;執行時型別檢查

4.const_cast<>(),去除變數的唯讀屬性

總結:在c++中的static_cast和reinterpret_cast就把c中的隱式轉換和強制型別轉換給概括了,對於reinterpret_cast來說很難保證資料的完整性,能用其他的型別轉換就別用reinterpret_cast,要注意每個型別轉換的場景,無論是進行什麼樣的型別轉換一定要明白轉換後是乙個什麼樣的型別。

變參模板 - 使得 emplace 可以接受任意引數,這樣就可以適用於任意物件的構建

完美** - 使得接收下來的引數 能夠原樣的傳遞給物件的建構函式,這帶來另乙個方便性

#include

#include

#include

#include

#include

using

namespace std;

class

student

student

(int age, string name,

int test)

student

(const student& s)

~student()

public

:int age;

string name;};

intmain

(void

)

總結:利用emplace可以直接對物件進行構造而不需要先構造乙個臨時的物件再操作,帶有很大的方便性,有興趣的朋友可以自己執行一下上面的**,會對記憶體操作的理解更加的深刻。

c 11常用特性

目錄 一 atomic 1 std atomic flag 2 std atomic 二 std thread 三 std condition variable 四 右值引用 五 std function std bind 六 lambda表示式 atomic flag 一種簡單的原子布林型別,只支...

c 11 特性學習

auto 含義改變,現為自動型別推斷 register c 11之前為建議使用cpu暫存器儲存變數,現在幾乎沒有意義 include include include include include include using namespace std initial intsum initiali...

C 11新特性學習

lambda表示式用於建立匿名的函式物件,語法為 函式可訪問的的外部變數 函式引數 返回值型別 如 int a 1,b 2 int c b int x int b 表示函式中可以訪問外部變數b,而且引數b是按值傳遞,b 表示引數b是按引用傳遞,表示可以訪問所有外部變數,並且是用按值傳遞方式,類似,也...