1、容器list
當你對某個type實施operator->,而該type並非built-in ptr時,編譯器會做一件很有趣的事,在找出user-defined operator->並將它施行於該type後,編譯器會對執行結果再次施行operator->。編譯器不斷執行這些動作直至觸及a pointer to built-in type,然後才進行成員訪問。
2、list的iterator --- list的迭代器
以operator++操作符為例。
(1)前++
self& operator++()
return by reference,通過引用返回,因此不會引起操作符過載。
(2)後++
self operator++(int)
1> 記錄原值 self tmp = *this;
此步不會引起operator*操作,因為先考慮的是=,即賦值操作,因此做的是拷貝構造操作。
2> 進行操作 ++*this,不會引起operator*操作,即++*this呼叫的是operator++()操作。
3> 返回原值,也呼叫的是拷貝建構函式,將值返回。
那麼現在存在乙個問題,為什麼前++返回的是引用,而後++返回的是值型別呢?而且後++的操作符過載有乙個int引數?
1> 後++的操作符過載有乙個int引數,c++語法規定,為了區分前++與後++操作符過載的區別,因此在後++操作符引數多乙個int型別的引數以標識區別。
2>為什麼前++返回的是引用,而後++返回的是值型別呢?
這個功能我們所根據int型別的前++與後++所仿寫的。
int i = 6;
++++i; -> ++(++)i;
i++++; -> (i++)++; // 這個是行不通的
因此list容器的++操作符過載也採用仿int型別的操作,前++可以多次++,即返回值採用引用,而後++不可以多次++,即返回值採用值返回。
2.9版本-》4.9版本
list繼承於_list_base,_list_base裡有乙個_list_impl,_list_impl繼承於_a<_list_node>,_list_impl有乙個_list_node_base,_list_node繼承於_list_node_base。
2、iterator設計需要遵循的原則
iterator必須提供的5種associated types
即
typedef bidirectional_iterator_tag iterator_category;
typedef _tp value_type;
typedef _tp* pointer;
typedef _tp& reference;
typedef ptrdiff_t difference_type;
value_type的主要目的是用來宣告變數,而宣告乙個無法被賦值的變數沒什麼用,所以iterator(即便是constant iterator)的value_type不應加上const,iterator若是const int,其value_type應該是int,而非const int。 《c語言深度剖析》學習筆記4
第五章 記憶體管理 5.1 野指標 定義指標變數的同時,最好初始化為null,用完指標之後,也將指標變數的值設定為null.5.2 棧 堆和靜態區 靜態區 儲存自動全域性變數和static變數。靜態區的內容在整個程式的生命週期內都存在,有編譯器編譯時分配。棧 儲存區域性變數。棧上的內容只在函式的範圍...
C語言深度剖析學習筆記 符號
1.預處理時,編譯器會使用空格替換,所以 in t i 0 是錯誤的,gcc e 編譯後變成 in t i 0 2.y x p 不等於 y x p,因為編譯器解析語法的時候,是從左到右,找最長的有意義的單元,對於第二段 編譯器找到x後繼續往後找,判斷 x 是否是合法的識別符號或者關鍵字,發現不是,於...
《C語言深度剖析》筆記
c語言深度剖析 筆記 1.在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返 回整形處理。2.register 變數必須是乙個單個的值,並且其長度應小於或等於整型 的長度。而且 register 變數可能不存放在記憶體中,所以不能用取 址運算子 來獲取 register變數的位址。3.int...