運算子過載及STL總結

2021-08-20 05:51:40 字數 4735 閱讀 5094

運算子過載

要點:什麼是運算子過載,其意義何在?

以成員函式的形式進行過載

通過友元函式實現過載 

++/--/<>/=過載

1.    明確目標:為什麼要進行運算子過載?

int x,y;

y=x+y;

表示兩個整數相加,很簡潔。但是,兩個字串合併:

char x[20],y[20];

strcat(x,y);

表達起來就不如

y=x+y

;那樣直觀簡潔。

因此,為了表達上的方便,我們進行運算子過載。賦予運算子新的含義,在面對不同型別的物件使用不同的含義。例如:在

string

類物件x,y

的環境下,運算子:「

+」,能被解釋為字串

x,y的合併。

2.以成員函式實現運算子過載

跟成員函式乙個套路,首先在類定義中宣告這個運算子,具體形式:

返回型別

operator

運算子(引數列表);

注:可以在類內定義,也可以在類外定義,在類外定義要使用作用域限定符「::」,

類外定義基本格式:

返回型別 類名::

operator

運算子(引數列表)

3.以友元函式的形式過載運算子

運算子過載函式除了可以作為類的成員函式,還可以作為非成員函式。為了不僅能訪問類中的公有成員,還能訪問私有成員和保護成員,通常運算子過載為友元函式。

運算子過載為友元函式宣告格式:

friend 函式返回型別 operator 運算子(形參表);

4.運算子過載的規則和限制

(1)只能對已有的c++運算子進行過載,而不能臆造新的運算子。

(2)不是所有的運算子都能過載,以下運算子不能過載:

.成員訪問運算子

.*成員指標訪問運算子

::域運算子

?:條件運算子

sizeof長度運算子

(3)過載以後四不變:運算元的個數不變,運算子的優先順序不變,運算子的結合型不變,運算子的語法結構不變,不能建立新的運算子。

(4)運算子過載函式不能有預設的引數

(5)只能以成員函式形過載的運算子:

[ ]下標運算子

=賦值運算子

()函式呼叫運算子

->用指標訪問物件成員

(6)只能過載為非成員函式的運算子:

流插入運算子《流提取運算子》

5. 成員運算子函式與友元運算子函式的比較

(1) 成員運算子函式比友元運算子函式少帶乙個引數(後置的++、--需要增加乙個形參)。

(2)  雙目運算子一般可以被過載為友元運算子函式或成員運算子函式,但當運算元型別不相同時,必須使用友元函式。

6.<>流插入\輸出運算子過載 

過載輸出運算子「<<」(只能被過載成友元函式,不能過載成成員函式)

定義輸出運算子「<<」過載函式的一般格式如下:

ostream& operator<<(ostream& out,class_name&obj)

out過載輸入運算子「>>」 (只能被過載成友元函式)

定義輸入運算子函式「>>」過載函式的一般格式如下:

istream& operator>>(istream& in,class_name&obj)

in>>obj.item1;

in>>obj.item2;

in>>obj.itemn;

return in;

7.++/--過載

設     a  aobject ;

運算子 ++和 - - 有兩種方式:

前置方式:   ++aobject         --aobject

成員函式  過載       a :: a operator++ () ;      

解釋為:  aobject . operator ++( ) ;

友元函式  過載         friend a operator++ (a &) ;

解釋為:        operator ++( aobject ) ;           

後置方式:     aobject ++      aobject --

成員函式  過載     a :: a operator++ (int) ;

解釋為:        aobject . operator ++(0 ) ;

友元函式  過載:       friend a operator++ (a &, int) ;      

解釋為:        operator++(aobject, 0);

成員函式過載:

#include

usingnamespacestd;  

classincrease  

increase():t(0){}  

increase operator ++()//前加運算模板;

increase operator ++(intx)//後加運算模板

friendostream & operator<<(ostream &out,increase & obj)  

};  

intmain()  

友元過載:

#include

usingnamespacestd;  

classincrease  

increase():t(0){}  

friendincrease operator ++(increase & obj)//前加運算模板,多乙個物件形參;

friendincrease operator ++(increase & obj,int)//後加運算模板,可以只有乙個int,即不要非得int x;

friendostream & operator<<(ostream &out,increase & obj)  

};  

intmain()  

8.=賦值號過載

賦值運算子過載用於物件資料的複製

operator= 必須過載為成員函式

過載函式原型為:

類名  &  類名  :: operator= ( 類名 )

#include

#include

using namespace std;

class  name

;std::setc(array,array+sizeof(array)/sizeof(array[0]));

與大小相關的操作(size operator)

size()-返回當前容器的元素數量

empty()-判斷容器是否為空

max_size()-返回容器能容納的最大元素數量

比較(comparison)

比較操作兩端的容器必須屬於同一型別

如果兩個容器內的所有元素按序相等,那麼這兩個容器相等

採用字典式順序判斷某個容器是否小於另乙個容器

賦值(assignment)和交換(swap)

swap用於提高賦值操作效率

迭代器(iterator)

可遍歷stl容器內全部或部分元素的物件

指出容器中的乙個特定位置

所有容器都提供兩種迭代器

container::iterator以「讀/寫」模式遍歷元素

container::const_iterator以「唯讀」模式遍歷元素

begin()-返回乙個迭代器,指向第乙個元素

end()-返回乙個迭代器,指向最後乙個元素之後

rbegin()-返回乙個逆向迭代器,指向逆向遍歷的第乙個元素

rend()-返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素之後

賦值(assignment)和交換(swap)

swap用於提高賦值操作效率

下面插入一段**來介紹用vector建立容器

#include#include#include#includeusing namespace std;

int main()

cout必須包含的標頭檔案#include

vector的大小(size)和容量(capacity)

size返回實際元素個數,

capacity返回vector能容納的元素最大數量。

主要操作有:

①、v.size()返回當前v中元素個數;

②、v.push_back(i),將i新增到v的尾部;

③、v.erase(pos),刪除迭代器pos所指向的元素;

容器迭代器對應的型別

容器類內迭代器類別

vector

隨機訪問迭代器

list

雙向迭代器

deque

隨機訪問迭代器

map雙向迭代器

multimap

雙向迭代器

set雙向迭代器

multiset

雙向迭代器

使用map/multimap之前要加入標頭檔案#include,map和multimap將key/value當作元素,進行管理。它們可根據key的排序準則自動將元素排序。multimap允許重複元素,map不允許重複元素。

過載運算子與STL總結

運算子過載 1.用成員函式過載運算子 class x 例如 過載 使複數相加 include using namespace std class complex 複數類 定義初始化表初始化complex類 complex double r,double i real r imag i 宣告成員函式,...

運算子過載與STL學習總結

運算子過載 不能過載的運算子 sizeof 運算子過載函式可以過載為成員函式和友元函式兩種。函式過載運算子 型別 operator運算子 參數列 返回型別 類名 operator 參數列 友元過載運算子 friend類名 operator 參數列 類名operator 參數列 成員運算子函式與友元運...

運算子過載和STL

include using namespace std class printdata public void print int i void setlength double len void setbreadth double bre void setheight double hei 過載 ...