Effective C++ 49,50,effective4950

來源:互聯網
上載者:User

Effective C++ 49,50,effective4950

49.熟悉標準庫。

C++標準庫很大。

首先標準庫中函數很多,為了避免名字衝突,使用命名空間std。而之前的庫函數都存放於< .h>中,現在成為偽標準庫。而不能直接將這些標頭檔全部直接添加命名空間,標準委員會只能重新建立了不帶.h的標頭檔。對於C中標頭檔採用同樣的方法,但是每個名字前添加一個c,如C中的<string.h>變成了<cstring>。舊的c++標頭檔是官方反對使用的,但舊的c標頭檔不是,為了保持對C的相容性。如 <string.h>是舊的C標頭檔,對應的是基於char*的字串處理函數,<string>是包含了std的C++標頭檔,對應的是新的string類,而<cstring>是C標頭檔的std版本,但這裡沒有string類的舊c++版本,因為官方不推薦這樣做。

第二,庫中幾乎都是模版。如iostream,操作字元流,流類實際就是類模版,在執行個體化流類的時候指定字元類型。即使是string,其實也是一個模版,型別參數限定了每個string類中的字元類型。string的型別宣告是:

typedef basic_string<char, char_traits<char>, allocator<char> >string;

這裡的字元類型與之前iostream中的字元類型是一個意思,它不是指char,指的是一個流中的字元,這裡字元類型確定其參數,字元類型指的是字元集,因為不同的字元集在實現的細節上不同,如特殊的檔案結束字元,拷貝他們的數組的最有效方式等,這些特徵在標準中被稱為traits。然後還有string對象執行動態記憶體分配的方法,使用一個Allocator參數,而Allocator類型的對象被用來分配和釋放string對象的記憶體,其是一個記憶體管理器。不要手動的聲明標準庫中的任何部分。

Iostream,和傳統的Iostream相比,它已經被模版化,繼承階層也進行了修改,增加了拋出異常的能力,支援string(通過stringstream)和國際化(通過locales)。新的Iostream可以將string和檔案當作流,還可以對流的行為做更廣泛的控制,包括緩衝和初始化。

容器,標準庫中提供了一下的高效實現,vector,list,queue,stack,deque,map,set和bitset。string是容器,對容器的任何操作都適用於string。標準庫的實現是高效的。使用容器可以消除動態分配記憶體造成的記憶體流失。

演算法,標準庫中提供了大量的簡易方法,稱為algorithm,實際為函數模版,其中大多數適用於庫中所有容器以及內建數組。演算法將容器的內容作為序列,每個演算法可以應用與一個容器中所有值對應的一個序列,或者一個子序列。標準演算法有,for_each 為序列中的每個元素調用某個函數, find 在序列中尋找包含某個值的第一個位置, count_if 計算序列中滿足某個判定為真的元素的數量,equal 判斷兩個序列包含的元素的值是否完全相等,search 在一個序列中找出某個子序列的起始位置,copy 拷貝一個序列到另一個, unique 在序列中重複資料刪除值, rotate 旋轉序列中的值,sort 對序列中的值排序,等等。和容器操作一樣,演算法也有效能保證。

對國際化的支援。提供有助於開發出國際化軟體的特性。支援國際化的最主要的構件是facets 和 locales 。facets描述的是對一種文化要處理哪些特性,包括定序(即某些地區字元集中的字元應該如何排序),日期和時間應該如何表示,數字和貨幣值應該如何表示,怎樣將資訊表示符映射成明確的語言資訊,等等。locales 將多組facets捆綁在一起,facets是指前面說到的那些特性中的一個,而locales 表示多個facets組成的一個對於某個國家的規則,若一個locales表示美國人是如何解決前面幾個問題的。

對於數文書處理的支援。C++庫中為複數類和專門針對數值編程而設計的特殊數組提供了模版。如valarray 類型的對象可以用來儲存可以任意混疊的元素,

診斷支援,標準庫支援三種報錯方式:C的斷言,錯誤號碼,例外 exception 。例外先派生出 logic_error 和 runtime_error ,然後再有這兩個類派生出具體的錯誤類型,logic_error 表示軟體中的邏輯錯誤,理論上可以通過更仔細的程式設計來防止。runtime_error 類型的例外為運行時才能發現的錯誤。

標準庫中的容器和演算法這部分一般被稱為標準模版庫 STL 。STL是標準庫中最具創新的部分,它的體繫結構具有擴充性,按照STL中的規範,可以進行很多擴充。


50.提高對C++的認識。

C++設計時的首要目標:與C的相容性,效率,和傳統開發工具及環境的相容性,解決真實問題的可應用性(即物件導向)。

以上目標闡明了C++語言中大量的實現細節。如,為什麼隱式產生的拷貝建構函式和賦值運算子要像現在這樣工作,尤其是指標產生的淺拷貝問題?因為這是C對struct的拷貝和賦值的方式,要與C相容。為什麼解構函式不自動聲明為virtual,為什麼實現細節必須出現在類的定義中?因為不這樣做會帶來效能上的損失,效率很重要。為什麼C++不能檢測非局部靜態對象間的初始化依賴關係?因為C++支援單獨編譯(即,分開編譯源模組,然後將多個目標檔案連結起來,形成可執行程式),依賴現有的連結器,不會程式資料打交道,所以c++編譯器幾乎不可能知道整個程式的一切情況。為什麼C++不讓程式員從一些繁雜事務如記憶體管理和低級指標操作中解脫出來?因為一些程式員需要這些處理能力,一個真正的程式員的需要自關重要。





利用線程的通訊機制,用兩個線程列印以下的結果: 1 2 A 3 4 B 5 6 C 7 8 D 49 50 Y 51 52 Z

public class MyTestThread1 { public static void main(String[] args) { Object obj = new Object(); Thread1 t1 = new Thread1(obj); t1.start(); Thread2 t2 = new Thread2(obj); Thread thread = new Thread(t2); thread.start(); }
}
class Thread1 extends Thread{ private Object obj;
public Thread1(Object obj) { this.obj = obj; }
@Override public void run() { synchronized (obj) { for(int i = 1;i <= 26;i++){ System.out.println(2*i - 1); System.out.println(2*i); } } }}class Thread2 implements Runnable{ private Object obj;
public Thread2(Object obj) { this.obj = obj; }
public void run() { synchronized (obj) { for(char c ='A';c <='Z';c++){ System.out.println(c); } } } }

 
佛教裡說大正48·352a、50,551b、49,796c~797a是什?

48卷352頁a
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.