操作符過載
一.運算子過載的含義與定義方式
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定義過載運算子+。
三.運算子過載函式的兩種形式:(主要是c++編譯器的解釋原則,比較有用)
成員函式形式和友元函式形式,他們都可訪問類中的私有成員。
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)
例:給複數運算子過載的四則運算符。複數由實部和虛部構造,定義乙個複數類,再在類中過載複數四則運算的運算子。
#include
class complex
complex complex::operator+(complex &c)
complex complex::operator-(complex &c)
void print(complex &c )
只能為友元運算子指定乙個引數,對x類的乙個物件obj:
表示式 c++編譯器的解釋
@obj operator @(obj)
obj@ operator @(obj,0)
2) x類中過載二元運算子@
返回型別 operator@(引數說明1,引數說明2) ]
兩個引數中必須至少有乙個是x類型別,設有物件obj1,obj2
表示式 c++編譯器的解釋
obj1@obj2
operator @(obj1,obj2)
例:用友元函式代替成員函式編上述程式:
#include
class complex
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 中,顯式介面只能使用介面呼叫,隱式介面使用類和介面呼叫皆可。c 首先動態庫分為顯示呼叫和隱式呼叫,這個的區別呢,顯示呼叫 需要loadlibray和freelibrary,隱式呼叫不需要loadlibrary和freelibrary,只是需要匯入相關的lib檔案,因此,如...
java 隱式呼叫和顯示呼叫
當我們在呼叫類的構造器來建立物件的時候,首先要呼叫的是父類的非靜態的初始化塊,接著會呼叫構造器,但是父類的構造器可能有多個,也就是過載,當呼叫完父類的非靜態初始化塊之後,將會呼叫的是當前類的非靜態初始化塊然後是自身的建構函式,呼叫父類的建構函式就有兩種呼叫的方式,乙個是顯示呼叫,另乙個是隱式呼叫,下...
dll顯示呼叫和隱式呼叫
pragma once 避免重複編譯 ifdef creatdll exports 這個巨集只要你選了專案配置型別為.dll,在預處理器裡會自動包含.define dll api declspec dllexport else define dll api declspec dllimport 當編...