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 這些操作符必須過載為全域性函式。如果想要讓它們可以訪問私有成員,則必須定義為友元。為何必須過載為全域性函式?如果操作符過載為乙個成員函式,則它必須是物件的成...