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 ...