C 標準程式庫

2021-12-29 21:33:18 字數 2898 閱讀 3090

1. 如果要把乙個template中的某個識別符號號指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此一般的規則是,除了以typename修飾之外,template內的任何識別符號號都被視為乙個值而非乙個型別.

2. 類的成員函式可以是個template,但這樣的成員函式既不能是virtual也不能有預設引數.

3. 如果程式允許我們為成員函式提供不同的template型別,就可以放寬」必須精確吻合」這條規則:只要型別可被賦值,就可以被當做上述成員模板函式的引數.

4. 通過explicit,我們可以禁止」單引數建構函式」,被用於自動型別轉換.其中有對應的乙個詞implicit.這個詞不是c++關鍵字(因為c++預設的是隱式轉換的).這裡這總結類似的關鍵字: volatile.使用這個關鍵字以後,優化器在用到這個變數時必須每次都小心的重新讀取這個變數的值,而不是使用儲存在暫存器中的備份.

5. auto_ptr中擁有權的轉移情況:

◆ 某函式是資料的終點.

voidskin(std::auto_ptr);

◆ 某函式是資料的起點

此外,不能以by reference方式傳遞auto_ptr.(無法預知擁有權是否被轉交)

就特性而言,constauto_ptr類似於常數指標(t*const p).而非指向常數d的指標.(const t* p)

如果auto_ptr在整個生命期內都不必改變其所指物件的擁有權,就可以使用const auto_ptr

const std::auto_ptr p(new int(42));

std::auto_ptr q(new int( -11 ));

*p = *q;//此時只是q指向了新的位址.所有權並沒有通過q轉移.

6. const 成員函式.其物件的成員不能改變.

因此不難得出以下結論:

◆const 成員函式即可以供const物件呼叫,也能供非const物件呼叫,此時const不能改變非const物件的成員

◆ const 物件不能呼叫非const  成員函式(因為非const物件可能會改變const物件)

◆非const函式不能呼叫const函式,反之可行

mutable關鍵字:在const成員函式中也能改變mutable修飾的變數

7.  前置式遞增(++pos)與後置遞增相比,前者效率高.因為需要額外的臨時物件.所以,在一般情況下使用前置

8. 在使用set和map時,要注意排序問題.(關聯容器)它們的實現是以樹作為基本結構來儲存.

9. 三類插入迭代器:

◆ back inserter:利用push_back操作向容器插入.適合的容器:vector,deque,list

◆ front insert:利用push_front操作向容器插入.適合的容器:deque,list.(相當於鍊錶前插)

◆ general insert:向第二個引數的位置前插入新的元素.

inserter(contain,contain.begin()) 相當於front_insert

inserter(contain,contain.end()) 相當於back_insert

10. 更易型演算法(remove,resort,modify)不能作用於關聯式容器,因此時會改變某位置上的」值」(指鍵值).另外在選用演算法的同時,首先應當確定是否可以利用容器的成員函式來代替.

11. 如果要把乙個template中的某個標示符指定為一種型別,就算意圖顯而易見,關鍵字typename也不可或缺,因此c++的一般規則是,處理以type修飾之外,template內的任何標示符都被視為乙個值,而非乙個型別.

舉例:class a; 

template

class myclass;

int main()

編譯器(vs2010)報錯: error c2143: 語法錯誤 : 缺少「;」(在「*」的前面).

編譯器好像並不認識subtype.這就是上面所說的把其當做為乙個值,而非型別.加上typename就ok了.

11. stl容器元素必須滿足的三個基本要求:

◆ 必須可透過copy建構函式進行複製.

◆ 必須可以透過assignment操作符完成賦值動作.

◆ 必須可以透過析構函式完成銷毀動作.

解釋一點:我們平日裡經常會寫乙個類的容器,但是,類裡面沒有看到什麼copy,assignment什麼的.為什麼程式還能正常執行?

舉例:#include

#include

using namespace std;

class a

private:

intm_ivalue;

};int main()

關鍵在於編譯器會在這種情況下幫我們合成自己的賦值和複製操作.

其他的需要滿足特殊情況的條件:

◆  對順序容器,元素的預設建構函式必須可用

◆  對於某些特殊動作,必須定義operator==以執行相等的測試.

◆  在關聯容器中,元素必須定義排序準則,這裡主要是定義<.>

12. c++標準庫對stl做出如下保證:

◆ 所有以節點來實現基礎的容器(list,set,multiset,map,multimap),如果及誒單構造失敗,容器保持不變.移除節點的容器保持不會失敗.然而如果是對關聯式容器插入多個元素,為保證已序性,失敗時無法完全恢復原狀.對插入單一元素操作,支援要麼成功,要麼原先的容器不受任何影響.此外,所有擦除操作(無論數量多少)肯定成功.

對list,就算插入多個元素,也屬於安全操作,實際上,處理remove,remove_if,merge,sort,unique之外,要麼成功,要麼不受任何影響.

◆ 所有以array為構造基礎的容器如vector,deque安插元素如果失敗,都無法做到完全恢復.如果元素的型別保證拷貝動作不拋異常,則所有加諸於改元素身上的操作都能夠保證要麼成功,要麼就毫無影響. 

摘自  yuanweihuayan的專欄 

C 之標準程式庫

標準程式庫 c 中的標準程式庫是類庫和函式的集合,其使用核心語言寫成。標準程式庫提供若干泛型容器 函式物件 泛型字串和流 包含互動和檔案i o 支援部分語言特性和常用的函式,如開平方根。c 標準程式庫也吸收了iso c90c標準程式庫。標準程式庫的特性宣告於std命名空間之中。從上面這個定義來看,c...

《C 標準程式庫》 1

這個關鍵字原則上只對建構函式起作用,抑制陰性轉換,例如 class string 如果此時呼叫 string s1 20 成功申請20個大小長度的字串 string s2 20 同上string s3 a 本意是要把a賦值給s3,結果是 申請了a字元對應大小的字串 此時原函式宣告變成 class s...

標準程式庫異常

p15 標準程式庫異常.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include include include using namespace std class student m age age m space new int 1024 1024 100 private ...