C 學習筆記 深度剖析list

2021-10-22 19:10:15 字數 2447 閱讀 1456

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