STL運用的C 技術(5) 過載操作符

2021-07-12 05:36:35 字數 3554 閱讀 2079

stl是c++標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c++泛型程式設計的很好例子。stl中運用了許多c++的高階技術。本文介紹過載操作符。主要參考了《c++ primer》和《stl原始碼剖析》。

過載操作符是具有特殊名稱的函式:保留了operator後接需定義的操作符符號。這是《c++ primer》中的定義。在stl中過載操作符主要用在兩個地方,乙個是迭代器中,另乙個是演算法中。本文介紹在迭代器中的應用,下篇介紹在演算法中的應用。在本系列博文中,多次提到迭代器,不愧是stl的關鍵所在。迭代器就像是各種容器物件的智慧型指標,這僅僅是我的理解。指標的各種行為中常見的有解引用操作符(*)、箭頭操作符(->)、自增、自減等。對於容器來說,必須過載這些操作符,以適應自身的指標行為。過載這些操作符,迭代器責無旁貸。看一段stl的原始碼,做了些修改,更清楚一些。

[cpp]view plain

copy

print?

//結點定義,雙向鍊錶

template

<

class

t>  

struct

list_node ;  

//鍊錶的迭代器

template

<

class

t, class

ref, 

class

ptr>  

class

list_iterator  

void

decr()   

public

:  typedef

t value_type;  

typedef

ptr pointer;  

typedef

ref reference;  

typedef

size_t

size_type;  

typedef

ptrdiff_t

difference_type;  

typedef

bidirectional_iterator_tag iterator_category;  

typedef

list_iteratoriterator;        

//迭代器

typedef

list_iteratorconst

t&, 

const

t*> const_iterator;  

typedef

list_iteratorself;  

list_iterator(list_node* x): node(x) {}     //接受鍊錶結點的建構函式,很管用

list_iterator() {}  

reference operator*() const

//解引用過載

pointer operator->() const

//箭頭過載

self& operator++()                         

//前增過載

self operator++(int

)       

//後增過載

self& operator--()                         

//前減重載

self operator--(int

)       

//後減重載

bool

operator==(

const

list_iterator& x) 

const

//相等過載

bool

operator!=(

const

list_iterator& x) 

const

//不相等過載

};  

上面這段**展現了這些操作符是如何被過載。其實這是個雙向鍊錶的迭代器定義,有自增和自減。再進一步,那麼鍊錶如何使用上述定義的迭代器呢?下面給出鍊錶的定義,只取stl鍊錶的部分功能,同時給出了測試用例。已在vs2008下測試通過。

[cpp]view plain

copy

print?

#include 

using

namespace

std;  

//結點定義,雙向鍊錶,把上面的**拷貝下來即可

//鍊錶的迭代器,把上面的**拷貝下來即可

//資源分配器

class

myalloc  

;  //鍊錶定義

template

<

class

t, class

alloc = myalloc >  

class

list  //構造哨兵結點

~list()     

//返回型別要求是iterator,而實際返回的是結點指標,為什麼可以呢?關鍵在於list_iterator有乙個接受結點指標的建構函式

iterator begin()                

const_iterator begin() const

iterator end()                 

const_iterator end() const

bool

empty() 

const

reference front()   

const_reference front() const

reference back()   

const_reference back() const

void

push_front(

const

t& x)   

void

push_back(

const

t& x)   

void

pop_front()   

void

pop_back()   

//插入結點

void

insert(iterator pos, 

const

t &x)   

//刪除結點

iterator erase(iterator pos)   

//清除所有結點

void

clear()   

node->next = node;  

node->prev = node;  

}  private

:  list_type node;  

list_type get_node()       

//分配空間

void

put_node(list_type p)   

//釋放空間

};  

//測試用例

intmain()    

上面這兩段程式已經給出了鍊錶的部分功能,同時看到了迭代器的運用以及過載操作符的實現。搞清楚了以上**,再去看stl的源**,可能會輕鬆一點吧,大同小異,核心的結構基本上都是這樣的。

9 過載操作符

include includeusing namespace std class num void print 也可以在內部提供乙個 號操作符過載,但和全域性 號過載如果呼叫方法一致,就只能存在乙個 num operator num other 過載 是修改自身,不能返回新物件,所以要返回自身引用 ...

C C 過載操作符(二) 過載操作符

用於訪問一組元素中的乙個元素。預設的,陣列是支援下標訪問的。中的下標稱為 索引,key,唯一標誌符 當乙個物件設計用於包含多個元素時,可以過載操作符 比如乙個字串text包含多個元素 每個元素是乙個字串 text txt helloworld char ch text 0 比如在乙個datastor...

C 運算子過載 11 過載 和 操作符

運算子 用於流輸出,而運算子 用於流輸出。在開始過載這些操作符之前,必須注意下面的事項 1 cout是輸出類的物件,而cin是輸入類的物件 2 這些操作符必須過載為全域性函式。如果想要讓它們可以訪問私有成員,則必須定義為友元。為何必須過載為全域性函式?如果操作符過載為乙個成員函式,則它必須是物件的成...