C C 之 操作符過載

2021-07-05 10:16:47 字數 4292 閱讀 2628

1.成員函式過載操作符:除「.」,「*」,「::」,「?:」外其他操作符都可過載

(1) 

a.雙目操作符宣告格式:

class 《類名》

b.雙目操作符定義格式:

《返回值型別》 《類名》::operator #(《型別》)

c.雙目操作符使用格式:

《類名》 a;

《類名》 b;

a # b

或a.operator(b);

(2)a.單目操作符過載宣告格式:

class 《類名》

b.單目操作符定義格式:

《返回值型別》 《類名》::operator #()

c.單目操作符使用格式:

《類名》 a;

#a;或

a.operator();

2.對於前置++(--)和後置++(--)可採用如下形式區別定義:

class counter

counter & operator ++()

counter operator ++(int )

};counter a,b,c;

b=++a;  //使用不帶引數的++過載函式,前置++的計算結果為左值,返回為引用

c=a++;  //使用帶int型引數的++過載函式,結果為臨時物件

3.全域性函式過載操作符

(1)a.全域性函式實現雙目操作符過載格式:

《返回值型別》 operator #(《型別1> 《引數1>,《型別2> 《引數2>){}  //型別1,型別2至少有乙個是類、結構、列舉或它們的引用型別

b.全域性函式實現雙目操作符使用格式:

《型別1> a;

《型別2> b;

a # b;

或operator #(a,b);

(2)a.全域性函式實現單目操作符格式:

《返回值型別》 opetator #(《型別》 《引數》){}  //型別必須是類、結構、列舉或它們的引用型別

b.全域性函式實現單目操作符使用格式:

《型別》 a;

# a;

或operator #(a);

為了區分前置++(--)和後置++(--),可定義乙個過載函式,增加乙個int引數。如後置++原型為:

《返回值型別》 operator ++(《型別》 《引數》, int);

除了=,(),,->外,其他操作符既可作為成員函式,也可作為全域性函式過載。這4個操作符只能作為成員函式來過載。另外某些情況下,操作符只能作為全域性函式來過載,全域性函式第乙個引數可以為其他型別,而成員函式第乙個引數規定為《類名》 * const this。

4.賦值操作符=:c++編譯程式為每個類定義乙個隱式的賦值操作符過載函式,逐個成員進行賦值,對應普通成員,採用通常的賦值操作,對於成員物件,呼叫該成員物件的賦值操作符過載函式賦值。對於包含成員物件的類來說,自己定義的賦值操作符過載函式不會自動呼叫成員物件的賦值操作符過載函式,必須要在自己定義的賦值操作符過載函式中顯式給出。

一般來講,需要自定義的拷貝建構函式的類通常也需要自定義的賦值操作符過載函式,拷貝建構函式和賦值操作符=過載函式的區別:

a.建立乙個物件時,用另乙個已存在的物件對其初始化,呼叫拷貝建構函式

b.對兩個已存在的物件,通過賦值操作用乙個物件改變另乙個物件的狀態時,呼叫賦值操作符過載函式。

賦值操作符只能作為非靜態的成員函式來過載,不能被派生類繼承。如果派生類沒有定義賦值操作符過載函式,則對派生類物件的賦值操作將呼叫系統提供的賦值操作符=過載函式,而不是基類的賦值操作符過載函式

5.類成員訪問操作符->:->為雙目操作符,第乙個運算元為乙個指向類或結構的指標,第二個運算元為第乙個運算元指向的類或結構的成員。通過對->過載,可實現一種智慧型指標。->操作符只能作為非靜態成員函式過載,過載時需要按單目操作符過載形式來實現,如:

class a

;class b

a  *opetator ->()    //操作符->的過載函式

int num_of_a_access()const

};a a;

b b(&a);     //b作為乙個智慧型指標,指向了a

b->f();  //等價於b.operator->()->f();即訪問a.f()

b->g();  //等價於b.operator->()->g();即訪問a.g()

cout《不能按照普通的間接訪問成員操作來理解,對於b->f(),應按照b.operator()->f()來理解。物件a可以看成是乙個共享資源,通過智慧型指標訪問它,可實現對資源訪問次數的統計。

6.new和delete過載:new的兩個功能:為物件分配記憶體空間和呼叫物件類的建構函式。delete也有兩個功能:呼叫物件析構函式和釋放物件空間。對new和delete過載時,過載的是分配空間和釋放空間的功能。

(1)new:必須作為靜態成員函式來過載(static可以不寫),格式為:

void * operator new(size_t size [,......]);

使用格式為:

a *p=new a;  //系統自動計算物件大小並傳給形參size

如果new的過載函式有其他引數,則動態物件的建立格式為:

a *p=new (......) a;   //......表示傳給new過載函式的其他實參

char buf[sizeof(a)];

a *p=new (buf) a(0);  //buf 是傳給new過載函式的引數,0是傳給建構函式的引數

對於上面建立的動態物件,其記憶體空間不是在程式堆區分配,而是由建立者提供,要使其消亡,不應該用delete,而是通過析構函式實現。一旦在乙個類中過載了new後,通過new動態建立該類的物件時,將不再用內建的new操作來分配記憶體空間,而是呼叫自己的new過載函式分配空間。

(2)delete:必須作為靜態成員函式來過載(static可以不寫),格式 :

void operator delete(void *p[, size_t size]);  //

使用格式:

a *p =new a;

delete p;

delete撤銷乙個物件時,系統首先呼叫物件的析構函式,然後呼叫delete的過載函式並把該物件的位址傳給它的第乙個形參p,如果有第二個引數,系統會把欲撤銷的物件的大小傳給它。delete過載函式只能有乙個,在某類中過載了delete後,通過delete撤銷物件時將不再呼叫內建的delete操作。而是呼叫自己的delete過載函式。過載的new和delete是類的靜態成員,可以被派生類繼承。

7.自定義型別轉換操作符:對於使用者自定義的類,c++提供了定義型別轉換的機制,通過帶乙個引數的構造 函式和對型別轉換操作符過載來實現乙個類和其他型別之間的轉換。

(1).帶乙個引數的建構函式用作型別轉換:帶乙個引數的建構函式可以用作從乙個基本型別或其他類到乙個類的轉換。如:

class complex

complex(double r)

complex(double r, double i)

friend complex operator +(const complex & x, const complex & y)

};complex operator +(complex & x, complex & y)

complex c1(1,2),c2,c3;

c2=c1+1.7;  隱式轉換成乙個複數物件complex(1.7)

c3=1.5+c2;  隱式轉換為乙個複數物件complex(1.5)

(2).自定義型別轉換:在乙個類中,可以對型別轉換操作符進行過載,實現乙個類到乙個基本資料型別或乙個其他類的轉換,如:

class a

};a a;

int i=1;

int z=i+a;  //呼叫型別轉換操作符int過載函式將a轉換成int型資料

當類中同時出現具有乙個引數建構函式和型別轉換操作符過載函式時,會產生歧義,如:

class a

a(int i)

operator int()

friend a operator +(const a &a1, const a &a2);

};a a;

int i=1,z;

z=a+i;  //a轉換成i,還是i轉換成a?

解決辦法是:

z=(int)a+i;

或z=a+(a)i;

也可以通過給a類的建構函式a(int i)加上explicit解決,即在函式開始加上explicit修飾符,其含義為:禁止把a(int i)當作隱式型別轉換符來用。

8.函式呼叫操作符():c++中,可以把函式呼叫作為一種操作符針對類來過載,如:

class a

a(int x)

int operator ()(int x)

};a a(3);

cout<

C C 過載操作符(二) 過載操作符

用於訪問一組元素中的乙個元素。預設的,陣列是支援下標訪問的。中的下標稱為 索引,key,唯一標誌符 當乙個物件設計用於包含多個元素時,可以過載操作符 比如乙個字串text包含多個元素 每個元素是乙個字串 text txt helloworld char ch text 0 比如在乙個datastor...

操作符過載 C C 學習筆記

一 什麼是操作符過載?考慮到類成員操作符過載可以訪問類中的私有變數,但是非類成員過載操作符卻不能很方便的訪問類的私有成員,為了方便起見,我們可以通過使用友元 friend 的方式,方便的訪問類的私有成員。舉例 class string 注意 friend宣告緊跟在類名之後,而不是放在public p...

C 之操作符過載

1.所謂過載,就是賦予其新的意義。函式可以過載,操作符也可以過載。操作符的過載給我們的程式設計帶來了很大的便利,因為操作符只能對基本的資料型別進行操作,而對使用者自定義的類等資料結構型別不支援。因此只能對其操作符進行過載之後,才能更加方便地操作我們自定義的類物件等資料型別。但是值得注意的是並不是c ...