運算子過載
1.運算子過載是對已有的運算子賦予多重含義,使同乙個運算子作用域不同型別的資料導致不同行為的發生。
2.過載運算子
不能過載的算符
.::.*?:(條件運算子)sizeof(求位元組數運算子)
可以過載的運算子
+-*/%^&|~
!=<>+=-=*=/=%
^=&=|=
<<>>>>=
<<===!=
<=>=&&||++--->*『->
()newdeletenewdelete
3.過載運算子的限制
不改變運算子的優先順序
不改變運算子的結合性
不改變運算子所需要的運算元
不能建立新的運算子
注意:過載運算子不允許創造新的運算子,只能對已有的c++運算子進行過載。
過載運算子必須和使用者定義的自定義型別的物件一起使用, 運算子函式的引數至少有乙個必須是類的物件或者類的物件的引用
過載運算子不能改變運算子的運算物件(運算元)的個數,過載運算子的功能應類似於該運算子作用於標準型別資料時所實現的功能。
4.過載運算子方式成員函式
成員運算子函式的原型在類的內部宣告格式如下:
class x
在類外定義成員運算子函式的格式如下:
返回型別x::operator運算子(形參表)
int&
operator
(int
i)return
arr[i];}};
雙目運算子過載為成員函式
對雙目運算子而言,成員運算子函式的形參表中僅有乙個引數,它作為運算子的右運算元,此時當前物件作為運算子的左運算元,它是通過this指標隱含地傳遞給函式的。
complex complex:: operator + (complex &c2)
return complex(real+c2.real, imag+c2.imag);}
一般而言,如果在類x中採用成員函式過載雙目運算子@,成員運算子函式operator@ 所需的乙個運算元由物件aa通過this指標隱含地傳遞,它的另乙個運算元bb在參數列中顯示,aa和bb是類x的兩個物件,則以下兩種函式呼叫方法是等價的:
aa @ bb;// 隱式呼叫
aa.operator@(bb);// 顯式呼叫
單目運算子過載為成員函式
對單目運算子而言,成員運算子函式的參數列中沒有引數,此時當前物件作為運算子的乙個運算元。
time time∷operator++( )//定義前置自增運算子「++」過載函式
return *this;//返回當前物件值
}time time∷operator++(int)//定義後置自增運算子「++」過載函式
return temp;//返回的是自加前的物件}5.
過載運算子方式友元函式
在第乙個引數需要隱式轉換的情形下,使用友元函式過載
運算子是正確的選擇
友元函式沒有this 指標,所需運算元都必須在參數列顯式
宣告,很容易實現型別的隱式轉換
c++中不能用友元函式過載的運算子有=()
[]->
class complex
complex(int a)
void print()const ;
friend complexoperator+ ( const complex & c1, const complex & c2 ) ;
private:
doublereal, image ;
};complex operator + ( const complex & c1, const complex& c2 )
注意:成員函式和友元函式的區別
成員運算子函式比友元運算子函式少帶乙個引數(後置的++、--需要增加乙個形參)。雙目運算子一般可以被過載為友元運算子函式或成員運算子函式,但當運算元型別不相同時,必須使用友元函式。
典型運算子過載
1.++和—前置和後置
前置成員函式
過載a :: a operator++ () ;
解釋為:aobject . operator ++( );
友元函式
過載friend a operator++ (a &) ;
解釋為:operator ++( aobject ) ;
後置成員函式
過載a :: aoperator++ (int) ;
解釋為:aobject . operator ++( 0) ;
友元函式
過載:friend a operator++ (a &, int) ;
解釋為:operator++(aobject, 0)
public :
increase ( )
increaseoperator ++ ( ) ;
// 前置
increaseoperator ++ ( int ) ;
// 後置
private:unsignedvalue ;
};increaseincrease :: operator++ ( )
increaseincrease :: operator++ ( int )
友元函式
public :
increase ( )
friend increaseoperator ++ ( increase & ) ;
//前置
friend increaseoperator ++ ( increase &, int ) ; // 後置
private:unsignedvalue ;
};increaseoperator ++ (increase & a )
increaseoperator ++ (increase & a, int )
運算子 和() 是二元運算子
注意:和() 只能用成員函式過載,不能用友元函式過載
運算子用於訪問資料物件的元素
int & operator [ ] (inti )
() 運算子用於函式呼叫
設x 是類x 的乙個物件,則表示式
x ( arg1, arg2, …)
可被解釋為
x . operator ()(arg1, arg2, … )
如: ;
doublef :: operator ( )( doublex ,doubley )
過載流插入和流提取運算子
istream 和ostream 是c++ 的預定義流類
cin 是istream 的物件,cout是ostream 的物件
運算子<< 由ostream 過載為插入操作,用於輸出基本型別資料
運算子》 由istream 過載為提取操作,用於輸入基本型別資料
用友元函式過載<< 和》 ,輸出和輸入使用者自定義的資料型別
過載輸出運算子「<<」(只能被過載成友元函式,不能過載成成員函式)
定義輸入運算子函式 「>>」過載函式的一般格式如下:
istream& operator>>(istream& in,class_name& obj)
個人心得:
運算子過載是乙個很方便的工具,面對不同的資料型別,或是許多資料型別結合的複雜資料型別,想要對它們進行操作,可以在已有運算子的前提下自定義擴充運算子含義,從而簡化了**的複雜程度,使其更直觀,便於呼叫。到現在我已經對於過載運算子有了一定的認識,但是在運用的情況下,還是有點錯誤,在定義運算子含義時也有點不准,在以後的練習中多注意這方面的練習。
過載運算子
題目描述 定義乙個矩形類,資料成員包括左下角和右上角座標,定義的成員函式包括必要的建構函式 輸入座標的函式,實現矩形加法,以及計算並輸出矩形面積的函式。要求使用提示中給出的測試函式並不得改動。兩個矩形相加的規則是 決定矩形的對應座標分別相加,如 左下角 1,2 右上角 3,4 的矩形,與 左下角 2...
過載運算子
include include using namespace std class test test const int a v a test const test t1 v t1.v 以下過載小於號 比較兩個物件的大小 bool operator const test t1 const 比較物件...
過載運算子
1.當乙個過載的運算子是成員函式時,this繫結到左側運算物件。成員運算子函式的引數比運算物件的數量少乙個。非成員函式呼叫等價於 data1 data2 普通表示式 operator data1,data2 等價的函式呼叫成員函式呼叫等價於 data1 data2 普通表示式 data1.opera...