C 程式設計題之新特性

2021-10-09 09:08:38 字數 2878 閱讀 9721

1. 語言可用性的強化

1)nullptr:本質還是0,但相對於null提供了型別;

2)範圍for;

3)auto自動推導型別

4)迭代器遍歷

5)繼承構造與委託構造

6)override:修飾虛函式,編譯器將檢查基類的函式是否存在這樣的虛函式;

7)final:修飾類,表示該類不可繼承;修飾虛函式,表示該函式不能被過載;

8)四種型別轉化

static_cast:

1)用於基礎型別之間的轉換,與c語言強制型別轉換一樣,沒有安全型別檢查;

2)用於上行轉換(子類轉父類);

const_cast:

用於const型別之間的轉化;

dynamic_cast

有條件轉換,執行時進行型別安全檢查。若下行檢查失敗,返回值為nullptr

reinterpret_cast:指標與其他型別之間的轉換

2. 語言執行時的強化

1)lambda表示式與匿名函式

2)右值引用

3)函式物件包含器和bind機制

目的是為函式提供乙個容器。

lambda函式本質是函式物件,當lambda表示式的捕獲列表為空時,lambda表示式還能作為乙個函式指標進行傳遞。在c++11中,能夠被呼叫的物件型別稱之為可呼叫型別。該型別***通過std::function引入***,支援以下四種型別。

a)普通函式

int fun(int b)

std::functionfunc = fun; // 包裝了乙個返回值為int,引數為int的函式。

b)匿名函式

c)類的成員函式

d)仿函式

4)智慧型指標與記憶體管理

為什麼要使用智慧型指標?

智慧型指標的作用是管理乙個指標,是因為存在以下幾種情況:申請記憶體空間在函式結束後忘記釋放,造成記憶體洩露。使用智慧型指標在很大程度上避免了這些問題,因為智慧型指標是乙個類,當超出了類的作用域時,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標的作用原理就是利用了函式結束時自動釋放記憶體空間,不用手動釋放。

auto_ptr:

auto_ptr特徵:

a)兩個auto_ptr物件擁有同一塊記憶體指標所有權時,某一時刻發生析構時,該記憶體釋放了多次,造成記憶體洩露;

b)兩個auto_ptr物件之間賦值時,內部指標被擁有的所有權發生轉移;

auto_ptr存在的問題:

a)作為函式引數傳遞,值傳遞呼叫拷貝建構函式,將原指標所有權轉移(原指標被清空);

b)不能使用vector,容易產生不可避免的錯誤;

auto_ptr提供的函式:get(); release(); reset();

unique_ptr:

相對於auto_ptr提公升了安全性(沒有了淺拷貝),增加了(delete析構)和對陣列的支援,禁止普通指標的賦值和拷貝。保證同一時間只有乙個智慧型指標可以指向該物件,避免資源洩露。

在auto_ptr的基礎上新增了move函式,該函式的使用,使unique_ptr交出內部指標的所有權,而自身置空,內部指標不會釋放。

例如:int *p = new int(9);

unique_ptr uptrl§;

unique_ptr uptrl2 = move(uptrl);

uptrl;// uptrl被置空不能再使用 否則報錯

share_ptr:

多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用被銷毀」的時候銷毀。內部使用計數機制表明資源被幾個指標共享。不僅可以通過new構造,還可以通過其它三個智慧型指標來構造。當呼叫release函式時,當前指標會釋放資源所有權,計數器減1,直到計數器為0,資源才會被徹底釋放。

為什麼share_ptr這麼好用還要提出weak_ptr?

share_ptr智慧型指標還會存在記憶體洩漏,當兩個物件相互使用乙個share_ptr成員變數指向對方,會造成迴圈引用,使引用計數失效,從而導致記憶體洩漏。

weak_ptr:

目的是配合share_ptr而引入一種智慧型指標來協助乙個share_ptr工作,它的構造和析構不會引起引用計數增加或者減少,weak_ptr是解決share_ptr相互引用時的死鎖問題,只是來打破一種平衡。

5)並行與併發

6)提公升c++的vector效能有哪些?

a. 提前分配足夠的記憶體空間避免不必要的重新分配;

b. 使用shrink_fit(可用swap)函式來釋放vector占用的空間而不是通過clear或者erase函式;

c. 在填充或者拷貝vector時,應該使用賦值而不是insert或者push_back;

d. 遍歷vector中元素時,盡量適用下標或者迭代器;

e. 向vector中插入元素時盡量使用emplace_back而不是push_back.

c 之函式新特性

void fun int i,int j 5 int k 10 void fun int i,int j 5,int k 錯誤,沒有預設值的引數放前面實參可以覆蓋形參的值 什麼是函式過載?在相同的作用域內,用同一函式名定義的多個函式 引數個數和引數型別不同 int getmax int x,int ...

c 新特性之default,delete

c 新特性之default,delete 用法 default 表示使用編譯器為我們提供的實現,delete表示刪除函式,不實現。default delete一般只能用在編譯器為我們生成的函式上,比如建構函式,拷貝構造,析溝函式 不要使用 delete 賦值等。delete可以用在普通成員函式,但是...

C 4 0 新特性之引數

c 4.0中新加了幾種引數,今天來了解一下 1.預設引數 c 4.0 現在對方法,構造器,以及索引器支援使用可預設的引數 當引數的預設值作為宣告的一部分被指定的時候,引數就是可預設的。static void changevalue intx,inty 3 int y 有乙個預設的引數3,因此它是乙個...