C++ 使用智能指針

掀起C++ 11的神祕面紗

C++標準在1998年獲得通過後,有兩位委員會委員預言,下一代C++標準將“肯定”包括內置的垃圾回收器(GC),但可能不會支持多線程,因爲定義一個可移植的線程模型涉及到的技術太複雜了,13年後,新的C++標準C++11也接近完成,你猜怎麼着?讓那兩位委員沒想到的是,本次更新還是沒有包括GC,但卻包括了一個先進的線程庫。C++之父Bjame Stroustrup說C++11就像一個新語言,的確,C++11核心已經發生了巨大的變化,它現在支持Lambda表達式,對象類型自動推斷,統一的初始化語法,委託構造函數,deleted和defaulted函數聲明nullptr,以及最重要的右值引用。

C++11中值得關注的幾大變化

Lambda表達式

自動類型推斷和decltype

統一初始化語法

Deleted和Defaulted函數

nullptr

委託構造函數

右值引用

C++11標準庫

C++於2003年以庫技術報告1(TR1)的形式經歷了重大改版,TR1包括新的容器類(unordered_set,unordered_map,unordered_multiset和unordered_multimap)和多個支撐正則表達式、元組和函數對象封裝器等的新庫。隨着C++11標準獲得通過,TR1和自它首次發佈以來新增的庫被正式納入標準的C++標準,下面是C++11標準庫的一些特性:

線程庫

站在程序員的角度來看,C++11最重要的新功能毫無疑問是並行操作,C++11擁有一個代表執行線程的線程類,在並行環境中用於同步,async()函數模板啓動並行任務,爲線程獨特的數據聲明thread_local存儲類型。如果你想找C++11線程庫的快速教程,請閱讀Anthony William的“C++0x中更簡單的多線程”。

新的智能指針類

C++98只定義了一個智能指針類auto_ptr,它現在已經被廢棄了,C++11引入了新的智能指針類shared_ptr和最近添加的unique_ptr,兩者都兼容其它標準庫組件,因此你可以在標準容器內安全保存這些智能指針,並使用標準算法操作它們。

新的算法

C++11標準庫定義了新的算法模仿all_of(),any_of()和none_of()操作,下面列出適用於ispositive()到(first, first+n)範圍,且使用all_of(), any_of() and none_of() 檢查範圍的屬性的謂詞:
 

  1. #include <algorithm>   
  2. //C++11 code    
  3. //are all of the elements positive?  
  4. all_of(first, first+n, ispositive()); //false  
  5. //is there at least one positive element?   
  6. any_of(first, first+n, ispositive());//true    
  7. // are none of the elements positive?    
  8. none_of(first, first+n, ispositive()); //false 


一種新型copy_n算法也可用了,使用copy_n()函數,複製一個包含5個元素的數組到另一個數組的代碼如下:
 

  1. #include  
  2. int source[5]={0,12,34,50,80};  
  3. int target[5];  
  4. //copy 5 elements from source to target  
  5. copy_n(source,5,target);  
  6.   


算法iota()創建了一個值順序遞增的範圍,好像分配一個初始值給*first,然後使用前綴++使值遞增,在下面的代碼中,iota()分配連續值{10,11,12,13,14}給數組arr,並將{‘a’,’b’,’c’}分配給char數組c。
 

  1. include <numeric> 
  2. int a[5]={0};  
  3. char c[3]={0};  
  4. iota(a, a+5, 10); //changes a to {10,11,12,13,14}  
  5. iota(c, c+3, 'a'); //{'a','b','c'} 


C++11仍然缺乏一些有用的庫,如XML API,套接字,GUI,反射以及前面提到的一個合適的自動垃圾回收器,但C++11的確也帶來了許多新特性,讓C++變得更加安全,高效,易學易用。

如果C++11的變化對你來說太大的話,也不要驚慌,多花些時間逐漸消化這一切,當你完全吸收了C++11的變化後,你可能就會同意Stroustrup的說法:C++11感覺就像一個新語言,一個更好的新語言。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章