面向?qū)ο蟪绦蛟O(shè)計的真正優(yōu)勢不僅僅在于繼承,還在于將派生類對象當(dāng)基類對象一樣處理的功能。支持這種功能的機(jī)制就是多態(tài)和動態(tài)綁定。
運(yùn)算符重載是對已有的運(yùn)算符賦予多重含義,使同一個運(yùn)算符作用于不同類型的數(shù)據(jù)時導(dǎo)致不同的行為。
2.1 運(yùn)算符重載的規(guī)則C++中除了 “.” 、“.*” 、 “::” 和 “?:” 外,其它運(yùn)算符全部可以重載,而且只能重載C++中已經(jīng)有的運(yùn)算符。
重載之后運(yùn)算符的優(yōu)先級和結(jié)合性都不會改變。
可以重載為類的非靜態(tài)函數(shù)成員和重載為非成員函數(shù)。其語法格式為:
返回類型 operator 運(yùn)算符(形參表){
函數(shù)體
}
返回類型指定了重載運(yùn)算符的返回類型;operator是定義運(yùn)算符重載函數(shù)的關(guān)鍵字;運(yùn)算符即使要重載的運(yùn)算符名稱。
下面示例了復(fù)數(shù)類加減法運(yùn)算重載為成員函數(shù):
#includeusing namespace std;
//復(fù)數(shù)類加減法運(yùn)算重載為成員函數(shù)
class Complex {public:
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {} //構(gòu)造函數(shù)
Complex operator+ (const Complex &c2) const; //重載復(fù)數(shù)加法
Complex operator- (const Complex& c2) const; //重載復(fù)數(shù)減法
void display() const; //顯示函數(shù)
private:
double real, imag;
};
Complex Complex::operator+ (const Complex& c2) const { //重載復(fù)數(shù)加法函數(shù)實(shí)現(xiàn)
return Complex(real + c2.real, imag + c2.imag);
}
Complex Complex::operator- (const Complex & c2) const { //重載復(fù)數(shù)減法函數(shù)實(shí)現(xiàn)
return Complex(real - c2.real, imag - c2.imag);
}
void Complex::display() const{ //顯示函數(shù)實(shí)現(xiàn)
cout<< "("<< real<< ","<< imag<< ")"<< endl;
}
int main() {Complex c1(5, 4), c2(2, 10), c3; //定義復(fù)數(shù)類的對象
cout<< "c1="; c1.display();
cout<< "c2="; c2.display();
c3 = c1 - c2;
cout<< "c3=c1-c2="; c3.display();
c3 = c1 + c2;
cout<< "c3=c1+c2="; c3.display();
return 0;
}
運(yùn)行結(jié)果為:
下面示例了將單目運(yùn)算符“++”重載為成員函數(shù):
#includeusing namespace std;
//將單目運(yùn)算符“++”重載為成員函數(shù)
class Clock {public:
Clock(int hour = 0, int minute = 0, int second = 0); //Clock類構(gòu)造函數(shù)
void showTime() const; //時間顯示函數(shù)
Clock& operator++(); //前置單目運(yùn)算符重載
Clock operator++(int); //后置單目運(yùn)算符重載
private:
int hour, minute, second;
};
Clock::Clock(int hour, int minute, int second) { //Clock類構(gòu)造函數(shù)實(shí)現(xiàn)
if (0<= hour && hour<= 24 && 0<= minute && minute<= 60 && 0<= second && second<= 60) {this->hour = hour;
this->minute = minute;
this->second = second;
}
else {cout<< "Time error!"<< endl;
}
}
void Clock::showTime() const {cout<< hour<< ":"<< minute<< ":"<< second<< endl;
}
Clock& Clock::operator++() {//前置單目運(yùn)算符重載函數(shù)
second++;
if (second >= 60) {second -= 60;
minute++;
if (minute >= 60) { minute -= 60;
hour = (hour + 1) % 24;
}
}
return * this;
}
Clock Clock::operator++(int) {//后置單目運(yùn)算符重載函數(shù)
Clock old = *this;
++(*this);
return old;
}
int main() {Clock myClock(23, 59, 59);
cout<< "First time output: ";
myClock.showTime();
cout<< "Show myClock++: ";
(myClock++).showTime();
cout<< "Show ++myClock: ";
(++myClock).showTime();
return 0;
}
運(yùn)行結(jié)果為:
運(yùn)算符重載為非成員函數(shù)的規(guī)則:
下面示例了以非成員函數(shù)形式重載Complex的加減法運(yùn)算和“<<”運(yùn)算符:
#includeusing namespace std;
//以非成員函數(shù)形式重載Complex的加減法運(yùn)算和“<<”運(yùn)算符
class Complex {public:
Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {}
friend Complex operator+ (const Complex& c1, const Complex& c2);
friend Complex operator- (const Complex& c1, const Complex& c2);
friend ostream & operator<< (ostream& out, const Complex& c);
private:
double real, imag;
};
Complex operator+ (const Complex& c1, const Complex& c2) {//重載加法運(yùn)算符實(shí)現(xiàn)
return Complex(c1.real + c2.real, c1.imag + c2.imag);
}
Complex operator- (const Complex& c1, const Complex& c2) {//重載減法運(yùn)算符實(shí)現(xiàn)
return Complex(c1.real - c2.real, c1.imag - c2.imag);
}
ostream& operator<< (ostream& out, const Complex& c) { //重載“<<”運(yùn)算符實(shí)現(xiàn)
out<< "("<< c.real<< ", "<< c.imag<< ")";
return out;
}
int main() {Complex c1(5, 4), c2(2, 10), c3;
cout<< "c1="<< c1<< endl;
cout<< "c2="<< c2<< endl;
c3 = c1 - c2;
cout<< "c3=c1-c2="<< c3<< endl; //使用重載運(yùn)算符完成復(fù)數(shù)加法
c3 = c1 + c2;
cout<< "c3=c1+c3="<< c3<< endl; //使用重載運(yùn)算符完成復(fù)數(shù)減法
return 0;
}
運(yùn)行結(jié)果為:
一般虛函數(shù)成員的聲明語法:
virtual 函數(shù)類型 函數(shù)名(形參表);
虛函數(shù)聲明只能出現(xiàn)在類定義中的函數(shù)原型中,而不能在成員函數(shù)實(shí)現(xiàn)的時候。
如果派生類沒有顯式的給出虛函數(shù)聲明,這是系統(tǒng)就會遵循以下規(guī)則來判斷派生類的一個函數(shù)成員是不是虛函數(shù):
如果從名稱、參數(shù)及返回值3方面檢查之后,派生類的函數(shù)滿足上述條件,就會自動確定為虛函數(shù)。這時稱派生類的虛函數(shù)覆蓋了基類的虛函數(shù)。
3.2 虛析構(gòu)函數(shù)虛析構(gòu)函數(shù)的聲明語法為:
virtual ~類名();
如果一個類的析構(gòu)函數(shù)是虛函數(shù),那么由她派生而來的所有子類的析構(gòu)函數(shù)也是虛函數(shù)。
3.3 純虛函數(shù)與抽象類抽象類是一種特殊的類,是為了抽象和設(shè)計的目的而建立的。抽象類是帶有純虛函數(shù)的類。
純虛函數(shù)
純虛函數(shù)是一個在基類中聲明的虛函數(shù),它在該基類中沒有定義具體的操作內(nèi)容,要求各派生類根據(jù)實(shí)際需要給出各自的定義。即對于暫時無法實(shí)現(xiàn)的函數(shù),可以聲明為純虛函數(shù),留給派生類去實(shí)現(xiàn)。純虛函數(shù)的聲明格式為:
virtual 函數(shù)類型 函數(shù)名(參數(shù)表)=0;
聲明為純虛函數(shù)之后,基類中就可以不再給出函數(shù)的實(shí)現(xiàn)部分。純虛函數(shù)的函數(shù)體由派生類給出。
抽象類
override與final都不是語言關(guān)鍵字,只有在特定的位置才有特別的含義,其它地方仍舊可以作為一般標(biāo)識符使用。
課程鏈接:https://www.bilibili.com/video/BV1iF411Y74v
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁標(biāo)題:【學(xué)習(xí)筆記】C++語言程序設(shè)計(鄭莉):多態(tài)性-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://muchs.cn/article48/deieep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、響應(yīng)式網(wǎng)站、服務(wù)器托管、網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容