不能重載的運算符包括 . :: .* ?: sizeof
可重載的運算符包括
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
重載運算符函數是對運算符的功能進行增加,並且原有的語義不變。1不改變運算符的優先級,。2不改變運算符的結合性。3不改變運算符所需要的操作數。4不能創建新的運算符。
運算符函數可以重載爲成員函數或友元函數。
一元運算符:Object op 或 op Object(op爲運算符)
重載爲成員函數,解釋爲:Object .operator op () 操作數由對象Object通過this指針隱含傳遞,因此參數表沒有參數。函數調用方式有兩種(1)op對象;(2)對象.operator op()。這兩種調用方式是等價的。
在類外的定義:返回類型 類名::operator op (形參表){}
重載爲友元函數,解釋爲:operatorop(Object) 操作數由參數表的參數Object提供。
在類外的定義:返回類型 operator op(形參表){}
二元運算符:ObjectL op ObjectR 兩個對象來操作
重載爲成員函數,解釋爲:ObjectL .operatorop ( ObjectR ) 左操作數由ObjectL通過this指針傳遞,右操作數由參數ObjectR傳遞。函數有兩種調用方式(1)對象1op對象2;(2)對象1.operator op(對象2)。這兩種調用方式也是等價的。
重載爲友元函數,解釋爲:operatorop (ObjectL, ObjectR ) 左右操作數都由參數傳遞。
二元運算符在操作數類型不同時,必須使用友元類重載。
友元函數重載運算符常用於運算符的左右操作數類型不同的情況,在第一個參數需要隱式轉換的情形下,使用友元函數重載運算符是正確的選擇。友元函數沒有 this指針,所需操作數都必須在參數表顯式聲明,很容易實現類型的隱式轉換。C++中不能用友元函數重載的運算符有 = () [] ->。
對於幾個常用的運算符++ -- = [] () << >>
++和--有前後兩種方式,後置或者前置中需要加上int虛參進行區分。
=必須重載爲成員函數。
運算符[]和()是二元運算符。[]和()和=一樣,只能用成員函數重載,不能用友元函數重載。
<<和>>只能重載爲友元函數,下面是類中和類外輸入輸出運算符的定義。
friend ostream& operator<<(ostream & os,const Date & p2);
friend istream & operator>>(istream & is,Date & p2);
ostream &operator<<(ostream & os,const Date & p2)
{
os<<p2.month<<""<<p2.day<<" "<<p2.hour<<""<<p2.minute;
return os;
}
istream & operator>>(istream & is,Date & p2)
{
is>>p2.month;
is>>p2.day;
is>>p2.hour;
is>>p2.minute;
return is;
}
STL是C++標準程序庫的核心,深刻影響了標準程序庫的整體結構,由一些可適應不同需求的集合類(collection class),以及在這些數據集合上操作的算法(algorithm)構成,內的所有組件都由模板(template)構成,其元素可以是任意類型,是所有C++編譯器和所有操作系統平臺都支持的一種庫。STL可以用容器(Container)迭代器(Iterator)算法(Algorithm) 三部分概括。
容器的作用是管理某類對象的集合,容器又分爲兩類1是序列式容器(序列式容器元素的默認構造函數必須可用)2是關聯式容器(關聯式容器必須定義出排序準則,默認情況是重載operator <)。定義一個空的容器 std::list<int>l; 如果兩個容器進行比較的話兩個容器的類型必須相同。
迭代器的作用是在對象集合上進行遍歷,指出容器中的一個特定位置,要注意的是end()操作是指向最後一個元素之後,而不是最後一個元素。所有容器都提供兩種迭代器container::iterator以“讀/寫”模式遍歷元素;container::const_iterator以“只讀”模式遍歷元素。迭代器分爲雙向迭代器隨機存取迭代器。
算法的作用是處理集合內的元素。
向量vector:
vector的作用和數組類似,但是是動態數組,比數組更加方便,好用。vector的元素可以是任意類型T,但必須具備賦值和拷貝能力。使用vector必須使用頭文件#include<vector>。vector的用法包括創建一個空的向量vector<T>c,c.size()返回元素個數,c.push_back(e)在尾部添加一個元素e的副本。c.pop_back()移除最後一個元素但不返回最後一個元素。等等。
map/multimap:
用平衡二叉樹管理元素。元素包含兩部分(key,value),key和value可以是任意類型,必須包含的頭文件#include <map>,根據元素的key自動對元素排序,因此根據元素的key進行定位很快,但根據元素的value定位很慢,不能直接改變元素的key,可以通過operator []直接存取元素值,map中不允許key相同的元素,multimap允許key相同的元素。
產生一個空的map:map map1; map<string,int>map1;用數組方式對map進行賦值: map1[“a”]=1; map1[“b”]=2;其中map可以是下列形式map<key,value> 一個以less(<)爲排序準則的map,map<key,value,op> 一個以op爲排序準則的map。map的函數用法和vector差不多。但是map有count(key) 返回”鍵值等於key”的元素個數,find(key)返回”鍵值等於key”的第一個元素,找不到返回end函數。這也使得map可以更加方便的在數據中找到需要查詢的數據。map還有lower_bound(key)返回”鍵值大於等於key”的第一個元素,upper_bound(key) 返回”鍵值大於key”的第一個元素,equal_range(key) 返回”鍵值等於key”的元素區間。
set/multiset:
使用平衡二叉樹管理元素。集合(Set)是一種包含已排序對象的關聯容器。必須包含的頭文件#include <set>。map容器是鍵-值對的集合,好比以人名爲鍵的地址和電話號碼。相反地,set容器只是單純的鍵的集合。當我們想知道某位用戶是否存在時,使用set容器是最合適的。set中不允許key相同的元素,multiset允許key相同的元素。set的函數用法和map類似。
算法: