C 操作符過載(小原則)

2021-06-16 02:50:46 字數 2712 閱讀 5838

一.運算子過載的含義與定義方式

l         c++已有的運算子只適合處理c++的基本資料型別。

l         c++允許重新定義已有的運算子(運算子過載),以便它能處理程式設計師定義型別(類型別)。

l         運算子過載就是賦予已有的運算子多重含義。運算子過載與函式過載類似,是它的特殊型別。

l         c++通過重新定義運算子,使它能夠用於特定類的物件執行特定的功能。

l         通過對+,-,*,/運算子的重新定義,使它們可以完成複數、分數等不同類的物件的加、減、乘、除運算操作。增強了c++語言的擴充能力。

l         先建立乙個運算子函式,一般定義成類的成員函式或友元函式。

二.過載乙個運算子原則:

1.不能改變運算子的初始意義。

2.不能改變運算子的引數數目。如過載運算子+時只用乙個運算元是錯誤的。

3.運算子函式不能包括預設的引數。

4.絕大部分c++運算子都可以過載,除以下的例外:

5.除賦值運算子外,其它運算子函式都可以由派生類繼承。

6.運算子過載不改變運算子的優先順序和結合性,也不改變運算子的語法結構,即單目、雙目運算子只能過載為單目、雙目運算子。

7.運算子的過載實際上是函式的過載。編譯程式對運算子過載的選擇,遵循函式過載的選擇原則。當遇到不很明顯的運算子時,編譯程式將去尋找引數匹配的運算子函式。

8.運算子過載可使程式更簡潔,使表示式更直觀,增強可讀性。但使用不宜過多。

9.過載運算子含義必須清楚:

如有乙個類time,它有三個資料成員時、分、秒

calss time

time(int h,int m,int s)

private:

int hours, minutes, seconds;

time t1(8,10,20), t2(9,15,30), t3;

t3=t1+t2;

這裡加法(+)運算用於類time的物件,就是含義不清的。所以不能給類time定義過載運算子+。

三.運算子過載函式的兩種形式:

成員函式形式和友元函式形式,他們都可訪問類中的私有成員。

1.過載為類的成員函式

1)x類中過載一元運算子@

返回型別   x::operator@( )

不指定引數,因為它已帶有乙個隱含的this引數,對x類的乙個物件obj:

表示式                c++編譯器的解釋

@obj                  operator @(obj)

obj@                  operator @(obj,0)

2)  x類中過載二元運算子@

返回型別   x::operator@(引數說明)

由於類的成員函式帶有乙個this引數,此時只能指定乙個引數,對obj物件:

表示式                c++編譯器的解釋

obj1@obj2             obj1·operator@(obj2)

在多數情況下,將運算子過載為類的成員函式和類的友元函式都是可以的。但成員函式運算子與友元函式運算子也具有各自的一些特點:

(1) 一般情況下,單目運算子最好過載為類的成員函式;雙目運算子則最好過載為類的友元函式。

(3) 型別轉換函式只能定義為乙個類的成員函式而不能定義為類的友元函式。

(4) 若乙個運算子的操作需要修改物件的狀態,選擇過載為成員函式較好。

(5) 若運算子所需的運算元(尤其是第乙個運算元)希望有隱式型別轉換,則只能選用友元函式。

(6) 當運算子函式是乙個成員函式時,最左邊的運算元(或者只有最左邊的運算元)必須是運算子類的一 個類物件(或者是對該類物件的引用)。如果左邊的運算元必須是乙個不同類的物件,或者是乙個內部 型別的物件,該運算子函式必須作為乙個友元函式來實現。

(7) 當需要過載運算子具有可交換性時,選擇過載為友元函式。

例:給複數運算子過載的四則運算符。複數由實部和虛部構造,定義乙個複數類,再在類中過載複數四則運算的運算子。

#include

class complex

complex complex::operator+(complex &c)

complex complex::operator-(complex &c)

void print(complex &c )

complex operator+(complex &c1,complex &c2)

complex operator-(complex &c1,complex &c2)

void print(complex &c )

a(int i,int j)

a(a &p)

a& operator =(a &p);

int getx()

int gety()

private:

int x,y;

a& a::operator =(a &p)

x=p.x;

y=p.y;

cout<<"assignment operator called./n";

return *this;

void main()

a a(7,8);

a b;

b=a;

cout7,8該程式中,在類a中定義了乙個賦值運算子函式,被定義為成員函式。

b=a解釋為: b.operator=(a)

呼叫下列函式:a& a::operator=(a &p)完成賦值操作。

C 操作符過載

1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...

C 過載操作符

過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...

c 操作符過載

過載操作符 一 限制 1 不能增加新的操作符 2 有些操作符不能過載,如.物件中的訪問成員 作用域解析操作符 sizeof 三元操作符 3 不能改變操作符的元數,元數是指與操作符相關的引數或運算元個數。比如一元操作符 只能應用於乙個操作符 4 不能改變操作符的優先順序 5 不能重新定義內建型別的操作...