運算子過載
要點:什麼是運算子過載,其意義何在?
以成員函式的形式進行過載
通過友元函式實現過載
++/--/<>/=過載
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 過載 ...