面試常見問題,c 11新特性

2021-10-24 00:18:32 字數 4557 閱讀 1109

auto關鍵字,編譯器根據上下文情況確定auto的真正型別

decltype ,有點類似於auto的反函式,能夠獲取變數型別 int a=1; decltype(a) b=a;

nullptr ,空指標,為了解決原來c++中null的二義性問題而引進的一種新的型別,因為null實際上代表的是0

voidf(

int a)

voidf(

int*p)

intmain()

序列for迴圈,可以用來遍歷陣列和容器、string。

mapint> m,,

};for(

auto p :m)

lambda

c11中引入的新技術,所有lambda的表示式都可以用更複雜的**來表示,因此可以說是一種語法糖。

// 定義簡單的lambda表示式 ,就像一種定義函式的快速方式

auto basiclambda =

;// 呼叫

basiclambda()

;// 輸出:hello, world!

// 指明返回型別

auto add =

(int a,

int b)

->

int;

// 自動推斷返回型別

auto multiply =

(int a,

int b)

;int sum =

add(2,

5);// 輸出:7

int product =

multiply(2

,5);

// 輸出:10

同時可以捕捉定義區間的內的數值

int

main()

;// 複製捕捉x

auto multiply_x =

[&x]

(int a)

;// 引用捕捉x

cout <<

add_x(10

)<<

" "<<

multiply_x(10

)<< endl;

// 輸出:20 100

return0;

}

:預設不捕獲任何變數;

[=]:預設以值捕獲所有變數;

[&]:預設以引用捕獲所有變數;

[x]:僅以值捕獲x,其它變數不捕獲;

[&x]:僅以引用捕獲x,其它變數不捕獲;

[=, &x]:預設以值捕獲所有變數,但是x是例外,通過引用捕獲;

[&, x]:預設以引用捕獲所有變數,但是x是例外,通過值捕獲;

[this]:通過引用捕獲當前物件(其實是複製指標);

[*this]:通過傳值方式捕獲當前物件;

容器的初始化方式 實際上用了模板的initializer list

int arr[3]

=;vector<

int> vec=

;map<

int,string> m=,}

;string str=

;

還可以作為引數輸入

#include

#include

using

namespace std;

template

<

typename

&t>

class

myarray

myarray

(const initializer_list

& il)};

intmain()

;return0;

//就不用先定義乙個vector再傳入。

}

返回值的推導,可以用auto設定函式返回值,編譯器根據上下文推導返回值。

智慧型指標

c++11:

1.shared_ptr

2.unique_ptr

3.weak_ptr

4.auto_ptr(被棄用)

class shared_ptr 實現共享式擁有(shared ownership)概念。多個智慧型指標指向相同物件,該物件和其相關資源會在 「最後乙個 reference 被銷毀」 時被釋放。為了在結構較複雜的情景中執行上述工作,標準庫提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等輔助類

class unique_ptr 實現獨佔式擁有(exclusive ownership)或嚴格擁有(strict ownership)概念,保證同一時間內只有乙個智慧型指標可以指向該物件。你可以移交擁有權。它對於避免記憶體洩漏(resource leak)——如 new 後忘記 delete ——特別有用

shared_ptr

多個指標共享同乙個物件,最後乙個指標負責銷毀物件釋放記憶體

可以防範cross-dll問題(物件在動態鏈結庫(dll)中被 new 建立,卻在另乙個 dll 內被 delete 銷毀)、自動解除互斥鎖

weak_ptr

weak_ptr 允許你共享但不擁有某物件,一旦最末乙個擁有該物件的智慧型指標失去了所有權,任何 weak_ptr 都會自動成空(empty)。因此,在 default 和 copy 建構函式之外,weak_ptr 只提供 「接受乙個 shared_ptr」 的建構函式。

可打破環狀引用(cycles of references,兩個其實已經沒有被使用的物件彼此互指,使之看似還在 「被使用」 的狀態)的問題

#include

#include

#include

using

namespace std;

classa;

classb;

classa

shared_ptrpb;};

classb

shared_ptr pa;};

void

test()

intmain()

output:

begin test.

..

end test

classb

weak_ptr pa;

};

unique_ptr

unique_ptr 是 c++11 才開始提供的型別,是一種在異常時可以幫助避免資源洩漏的智慧型指標。採用獨佔式擁有,意味著可以確保乙個物件和其相應的資源同一時間只被乙個 pointer 擁有。一旦擁有著被銷毀或程式設計 empty,或開始擁有另乙個物件,先前擁有的那個物件就會被銷毀,其任何相應資源亦會被釋放。

取代auto_ptr

dynamic_cast 運算子的主要用途:將基類的指標或引用安全地轉換成派生類的指標或引用,並用派生類的指標或引用呼叫非虛函式。如果是基類指標或引用呼叫的是虛函式無需轉換就能在執行時呼叫派生類的虛函式。

這個函式常用於對基類和派生類之間的指標轉化,比如

struct base };

struct derived : base };

base* bp1 =

new base;

base* bp2 =

new derived;

if(derived* p =

dynamic_cast

>

(bp1)

)// 轉型失敗,返回 nullptr

p->df(

);// 不執行if(

auto p =

dynamic_cast

>

(bp2)

)// 轉型成功

p->df(

);// 執行

if 語句在c17之後的變化,從上面的**中我們可以看到,可以在判斷語句中加入初始化語句

if

(int i=

3; i >2)

else和if

(int i=3)

else

都會輸出3

>

2,即在判斷語句上可以加入賦值語句,如果後面跟判斷則要用;隔開。

std::vector<

int> v=

;for

(auto

&i :v)

i+=1

;for

(auto i:v)

std::cout<" ";

int a=

;for

(auto

&i :a)

i+=1

;for

(auto i:a)

std::cout<" ";

C 11新特性學習

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

C 11 新特性試用

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。各種作用域內宣告變數都可以用到它。例如,名空間中,程式塊中,或是for迴圈的初始化語句中。auto i 42 i is an int a...

C 11 新特性總結

vs2012以上版本支援 一.auto的使用 auto func less 自動表示函式指標 auto ite vector a.begin 自動表示stl的迭代器 auto p new foo 自動表示變數指標等變數 二.decltype int x 3 decltype x y x 從變數或表示...