版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4章運(yùn)算符重載4.1什么是運(yùn)算符重載所謂重載,就是重新賦予新的含義。函數(shù)重載就是對(duì)一個(gè)已有的函數(shù)賦予新的含義,使之實(shí)現(xiàn)新功能。例4.1通過(guò)函數(shù)來(lái)實(shí)現(xiàn)復(fù)數(shù)相加。#include<iostream>usingnamespacestd;classComplex//定義Complex類(lèi){public:Complex(){real=0;imag=0;}//定義構(gòu)造函數(shù)Complex(doubler,doublei){real=r;imag=i;}Complexcomplex_add(Complex&c2);voiddisplay();//聲明輸出函數(shù)private:doublereal;//實(shí)部doubleimag;//虛部};ComplexComplex∷complex_add(Complex&c2){Complexc;c.real=real+c2.real;c.imag=imag+c2.imag;returnc;}voidComplex∷display()//定義輸出函數(shù){cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}intmain(){Complexc1(3,4),c2(5,-10),c3;//定義3個(gè)復(fù)數(shù)對(duì)象c3=plex_add(c2);//調(diào)用復(fù)數(shù)相加函數(shù)cout<<″c1=″;c1.display();//輸出c1的值cout<<″c2=″;c2.display();//輸出c2的值cout<<″c1+c2=″;c3.display();//輸出c3的值return0;}4.2運(yùn)算符重載的方法運(yùn)算符重載的方法是定義一個(gè)重載運(yùn)算符的函數(shù),在需要執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)就自動(dòng)調(diào)用該函數(shù),以實(shí)現(xiàn)相應(yīng)的運(yùn)算。運(yùn)算符重載是通過(guò)定義函數(shù)實(shí)現(xiàn)的。運(yùn)算符重載實(shí)質(zhì)上是函數(shù)的重載。重載運(yùn)算符的函數(shù)一般格式如下:
函數(shù)類(lèi)型operator運(yùn)算符名稱(形參表列){對(duì)運(yùn)算符的重載處理}例如,想將“+”用于Complex類(lèi)(復(fù)數(shù))的加法運(yùn)算,函數(shù)的原型可以是這樣的:Complexoperator+(Complex&c1,Complex&c2);例4.2改寫(xiě)例4.1,重載運(yùn)算符“+”,使之能用于兩個(gè)復(fù)數(shù)相加。#include<iostream>usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c2);voiddisplay();private:doublereal;doubleimag;};ComplexComplex∷operator+(Complex&c2){Complexc;c.real=real+c2.real;c.imag=imag+c2.imag;returnc;}voidComplex∷display(){cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}intmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;//運(yùn)算符+用于復(fù)數(shù)運(yùn)算cout<<″c1=″;c1.display();cout<<″c2=″;c2.display();cout<<″c1+c2=″;c3.display();return0;}4.2運(yùn)算符重載的方法比較例4.1和例4.2,只有兩處不同:(1)在例4.2中以operator+函數(shù)取代了例4.1中的complex_add函數(shù),而且只是函數(shù)名不同,函數(shù)體和函數(shù)返回值的類(lèi)型都是相同的。(2)在main函數(shù)中,以“c3=c1+c2;”取代了例4.1中的“c3=plex_add(c2);”。在將運(yùn)算符+重載為類(lèi)的成員函數(shù)后,C++編譯系統(tǒng)將程序中的表達(dá)式c1+c2解釋為c1.operator+(c2)//其中c1和c2是Complex類(lèi)的對(duì)象即以c2為實(shí)參調(diào)用c1的運(yùn)算符重載函數(shù)operator+(Complex&c2),進(jìn)行求值,得到兩個(gè)復(fù)數(shù)之和。4.3重載運(yùn)算符的規(guī)則(1)C++不允許用戶自己定義新的運(yùn)算符,只能對(duì)已有的C++運(yùn)算符進(jìn)行重載。(2)C++允許重載的運(yùn)算符C++中絕大部分的運(yùn)算符允許重載。不能重載的運(yùn)算符只有5個(gè):
.(成員訪問(wèn)運(yùn)算符)
.*(成員指針訪問(wèn)運(yùn)算符)∷(域運(yùn)算符)sizeof(長(zhǎng)度運(yùn)算符)?:(條件運(yùn)算符)4.3重載運(yùn)算符的規(guī)則(3)重載不能改變運(yùn)算符運(yùn)算對(duì)象(即操作數(shù))的個(gè)數(shù)。(4)重載不能改變運(yùn)算符的優(yōu)先級(jí)別。(5)重載不能改變運(yùn)算符的結(jié)合性。(6)重載運(yùn)算符的函數(shù)不能有默認(rèn)的參數(shù),否則就改變了運(yùn)算符參數(shù)的個(gè)數(shù),與前面第(3)點(diǎn)矛盾。4.3重載運(yùn)算符的規(guī)則(7)重載的運(yùn)算符必須和用戶定義的自定義類(lèi)型的對(duì)象一起使用,其參數(shù)至少應(yīng)有一個(gè)是類(lèi)對(duì)象(或類(lèi)對(duì)象的引用)。也就是說(shuō),參數(shù)不能全部是C++的標(biāo)準(zhǔn)類(lèi)型,以防止用戶修改用于標(biāo)準(zhǔn)類(lèi)型數(shù)據(jù)的運(yùn)算符的性質(zhì)。intoperator+(inta,intb){return(a-b);}4.3重載運(yùn)算符的規(guī)則(8)用于類(lèi)對(duì)象的運(yùn)算符一般必須重載,但有兩個(gè)例外,運(yùn)算符“=”和“&”不必用戶重載。①賦值運(yùn)算符(=)可以用于每一個(gè)類(lèi)對(duì)象,可以利用它在同類(lèi)對(duì)象之間相互賦值。②地址運(yùn)算符&也不必重載,它能返回類(lèi)對(duì)象在內(nèi)存中的起始地址。(9)應(yīng)當(dāng)使重載運(yùn)算符的功能類(lèi)似于該運(yùn)算符作用于標(biāo)準(zhǔn)類(lèi)型數(shù)據(jù)時(shí)所實(shí)現(xiàn)的功能。(10)運(yùn)算符重載函數(shù)可以是類(lèi)的成員函數(shù)(如例4.2),也可以是類(lèi)的友元函數(shù),還可以是既非類(lèi)的成員函數(shù)也不是友元函數(shù)的普通函數(shù)。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)重載函數(shù)operator+訪問(wèn)了兩個(gè)對(duì)象中的成員,一個(gè)是this指針指向的對(duì)象中的成員,一個(gè)是形參對(duì)象中的成員。如this->real+c2.real,this->real就是c1.real。在將運(yùn)算符函數(shù)重載為成員函數(shù)后,如果出現(xiàn)含該運(yùn)算符的表達(dá)式,如c1+c2,編譯系統(tǒng)把它解釋為c1.operator+(c2)即通過(guò)對(duì)象c1調(diào)用運(yùn)算符重載函數(shù),并以表達(dá)式中第二個(gè)參數(shù)(運(yùn)算符右側(cè)的類(lèi)對(duì)象c2)作為函數(shù)實(shí)參。運(yùn)算符重載函數(shù)的返回值是Complex類(lèi)型,返回值是復(fù)數(shù)c1和c2之和(Complex(c1.real+c2.real,c1.imag+c2.imag))。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)運(yùn)算符重載函數(shù)除了可以作為類(lèi)的成員函數(shù)外,還可以是非成員函數(shù)。例4.3將運(yùn)算符“+”重載為適用于復(fù)數(shù)加法,重載函數(shù)不作為成員函數(shù),而放在類(lèi)外,作為Complex類(lèi)的友元函數(shù)。#include<iostream>usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}friendComplexoperator+(Complex&c1,Complex&c2);//重載函數(shù)作為友元函數(shù)voiddisplay();private:doublereal;doubleimag;};Complexoperator+(Complex&c1,Complex&c2)//定義作為友元函數(shù)的重載函數(shù){returnComplex(c1.real+c2.real,c1.imag+c2.imag);}voidComplex∷display(){cout<<″(″<<real<<″,″<<imag<<″i)″<<endl;}intmain(){Complexc1(3,4),c2(5,-10),c3;c3=c1+c2;cout<<″c1=″;c1.display();cout<<″c2=″;c2.display();cout<<″c1+c2=″;c3.display();}4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)在將運(yùn)算符“+”重載為非成員函數(shù)后,C++編譯系統(tǒng)將程序中的表達(dá)式c1+c2解釋為operator+(c1,c2)即執(zhí)行c1+c2相當(dāng)于調(diào)用以下函數(shù):Complexoperator+(Complex&c1,Complex&c2){returnComplex(c1.real+c2.real,c1.imag+c2.imag);}求出兩個(gè)復(fù)數(shù)之和。運(yùn)行結(jié)果同例4.2。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)運(yùn)算符重載函數(shù)可以是類(lèi)的成員函數(shù),也可以是類(lèi)的友元函數(shù),還可以是既非類(lèi)的成員函數(shù)也不是友元函數(shù)的普通函數(shù)。首先,只有在極少的情況下才使用既不是類(lèi)的成員函數(shù)也不是友元函數(shù)的普通函數(shù),原因是普通函數(shù)不能直接訪問(wèn)類(lèi)的私有成員。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)如果將運(yùn)算符重載函數(shù)作為成員函數(shù),它可以通過(guò)this指針自由地訪問(wèn)本類(lèi)的數(shù)據(jù)成員,因此可以少寫(xiě)一個(gè)函數(shù)的參數(shù)。但必須要求運(yùn)算表達(dá)式第一個(gè)參數(shù)(即運(yùn)算符左側(cè)的操作數(shù))是一個(gè)類(lèi)對(duì)象,而且與運(yùn)算符函數(shù)的類(lèi)型相同。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)如想將一個(gè)復(fù)數(shù)和一個(gè)整數(shù)相加,如c1+i,可以將運(yùn)算符重載函數(shù)作為成員函數(shù),如下面的形式:ComplexComplex∷operator+(int&i)//運(yùn)算符重載函數(shù)作為Complex類(lèi)的成員函數(shù){returnComplex(real+i,imag);}注意在表達(dá)式中重載的運(yùn)算符“+”左側(cè)應(yīng)為Complex類(lèi)的對(duì)象,如c3=c2+i;不能寫(xiě)成c3=i+c2;//編譯出錯(cuò)4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)如果函數(shù)需要訪問(wèn)類(lèi)的私有成員,則必須聲明為友元函數(shù)??梢栽贑omplex類(lèi)中聲明:friendComplexoperator+(int&i,Complex&c);//第一個(gè)參數(shù)可以不是類(lèi)對(duì)象在類(lèi)外定義友元函數(shù):Complexoperator+(int&i,Complex&c)//運(yùn)算符重載函數(shù)不是成員函數(shù){returnComplex(i+c.real,c.imag);}4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)將雙目運(yùn)算符重載為友元函數(shù)時(shí),在函數(shù)的形參表列中必須有兩個(gè)參數(shù),不能省略,形參的順序任意,不要求第一個(gè)參數(shù)必須為類(lèi)對(duì)象。但在使用運(yùn)算符的表達(dá)式中,要求運(yùn)算符左側(cè)的操作數(shù)與函數(shù)第一個(gè)參數(shù)對(duì)應(yīng),運(yùn)算符右側(cè)的操作數(shù)與函數(shù)的第二個(gè)參數(shù)對(duì)應(yīng)。如c3=i+c2;//正確,類(lèi)型匹配c3=c2+i;//錯(cuò)誤,類(lèi)型不匹配
4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)注意,數(shù)學(xué)上的交換律在此不適用。如果希望適用交換律,則應(yīng)再重載一次運(yùn)算符“+”。如Complexoperator+(Complex&c,int&i)//此時(shí)第一個(gè)參數(shù)為類(lèi)對(duì)象{returnComplex(i+c.real,c.imag);}編譯系統(tǒng)會(huì)根據(jù)表達(dá)式的形式選擇調(diào)用與之匹配的運(yùn)算符重載函數(shù)。4.4運(yùn)算符重載函數(shù)作為類(lèi)成員函數(shù)和友元函數(shù)可以將以上兩個(gè)運(yùn)算符重載函數(shù)都作為友元函數(shù),也可以將一個(gè)運(yùn)算符重載函數(shù)(運(yùn)算符左側(cè)為對(duì)象名的)作為成員函數(shù),另一個(gè)(運(yùn)算符左側(cè)不是對(duì)象名的)作為友元函數(shù)。但不可能將兩個(gè)都作為成員函數(shù)。單目運(yùn)算符重載為成員函數(shù),雙目運(yùn)算符重載為友元函數(shù)。4.5重載雙目運(yùn)算符例4.4定義一個(gè)字符串類(lèi)String,用來(lái)存放不定長(zhǎng)的字符串,重載運(yùn)算符“==”,“<”和“>”,用于兩個(gè)字符串的等于、小于和大于的比較運(yùn)算。4.5重載雙目運(yùn)算符編寫(xiě)C++程序的指導(dǎo)思想是:先搭框架,逐步擴(kuò)充,由簡(jiǎn)到繁,最后完善。邊編程,邊調(diào)試,邊擴(kuò)充。例4.4(1)先建立一個(gè)string類(lèi)(2)重載運(yùn)算符“>”(3)擴(kuò)展到3個(gè)運(yùn)算符重載(4)最后完善輸出4.6重載單目運(yùn)算符單目運(yùn)算符只有一個(gè)操作數(shù),如!a,-b,&c,*p,還有最常用的++i和--i等。重載單目運(yùn)算符的方法與重載雙目運(yùn)算符的方法是類(lèi)似的。但由于單目運(yùn)算符只有一個(gè)操作數(shù),因此運(yùn)算符重載函數(shù)只有一個(gè)參數(shù),如果運(yùn)算符重載函數(shù)作為成員函數(shù),則還可省略此參數(shù)。例4.5例4.64.7重載流插入運(yùn)算符和流提取運(yùn)算符C++的流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”是C++在類(lèi)庫(kù)中提供的,所有C++編譯系統(tǒng)都在類(lèi)庫(kù)中提供輸入流類(lèi)istream和輸出流類(lèi)ostream。cin和cout分別是istream類(lèi)和ostream類(lèi)的對(duì)象。在類(lèi)庫(kù)提供的頭文件中已經(jīng)對(duì)“<<”和“>>”進(jìn)行了重載,使之作為流插入運(yùn)算符和流提取運(yùn)算符,能用來(lái)輸出和輸入C++標(biāo)準(zhǔn)類(lèi)型的數(shù)據(jù)。4.7重載流插入運(yùn)算符和流提取運(yùn)算符用戶自定義類(lèi)型的數(shù)據(jù),是不能直接用“<<”和“>>”來(lái)輸出和輸入的。如果想用它們輸出和輸入自己聲明的類(lèi)型的數(shù)據(jù),必須對(duì)它們重載。對(duì)“<<”和“>>”重載的函數(shù)形式如下:istream&operator>>(istream&,自定義類(lèi)&);ostream&operator<<(ostream&,自定義類(lèi)&);
4.7重載流插入運(yùn)算符和流提取運(yùn)算符重載運(yùn)算符“>>”的函數(shù)的第一個(gè)參數(shù)和函數(shù)的類(lèi)型都必須是istream&類(lèi)型,第二個(gè)參數(shù)是要進(jìn)行輸入操作的類(lèi)。重載“<<”的函數(shù)的第一個(gè)參數(shù)和函數(shù)的類(lèi)型都必須是ostream&類(lèi)型,第二個(gè)參數(shù)是要進(jìn)行輸出操作的類(lèi)。因此,只能將重載“>>”和“<<”的函數(shù)作為友元函數(shù)或普通的函數(shù),而不能將它們定義為成員函數(shù)。4.7重載流插入運(yùn)算符和流提取運(yùn)算符4.7.1重載流插入運(yùn)算符<<例4.7程序中重載了運(yùn)算符“<<”,運(yùn)算符重載函數(shù)中的形參output是ostream類(lèi)對(duì)象的引用,形參名output是用戶任意起的。分析main函數(shù)最后第二行:cout<<c3;運(yùn)算符“<<”的左面是cout,前面已提到cout是ostream類(lèi)對(duì)象。“<<”的右面是c3,它是Complex類(lèi)對(duì)象。4.7重載流插入運(yùn)算符和流提取運(yùn)算符4.7.1重載流插入運(yùn)算符<<由于已將運(yùn)算符“<<”的重載函數(shù)聲明為Complex類(lèi)的友元函數(shù),編譯系統(tǒng)把“cout<<c3”解釋為operator<<(cout,c3)即以cout和c3作為實(shí)參,調(diào)用下面的operator<<函數(shù):ostream&operator<<(ostream&output,Complex&c){output<<″(″<<c.real<<″+″<<c.imag<<″i)″;returnoutput;}調(diào)用函數(shù)時(shí),形參output成為cout的引用,形參c成為c3的引用。因此調(diào)用函數(shù)的過(guò)程相當(dāng)于執(zhí)行:cout<<″(″<<c3.real<<″+″<<c3.imag<<″i)″;returncout;4.7重載流插入運(yùn)算符和流提取運(yùn)算符4.7.1重載流插入運(yùn)算符<<說(shuō)明:在本程序中,在Complex類(lèi)中定義了運(yùn)算符“<<”重載函數(shù)為友元函數(shù),因此只有在輸出Complex類(lèi)對(duì)象時(shí)才能使用重載的運(yùn)算符,對(duì)其他類(lèi)型的對(duì)象是無(wú)效的。如cout<<time1;//time1是Time類(lèi)對(duì)象,不能使用用于Complex類(lèi)的重載運(yùn)算符4.7重載流插入運(yùn)算符和流提取運(yùn)算符4.7.2重載流插入運(yùn)算符>>重載流提取運(yùn)算符的目的是希望將“>>”用于輸入自定義類(lèi)型的對(duì)象的信息。例4.84.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.1標(biāo)準(zhǔn)類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換在C++中,某些不同類(lèi)型數(shù)據(jù)之間可以自動(dòng)轉(zhuǎn)換,例如inti=6;i=7.5+i;編譯系統(tǒng)對(duì)7.5是作為double型數(shù)處理的,在求解表達(dá)式時(shí),先將6轉(zhuǎn)換成double型,然后與7.5相加,得到和為13.5,在向整型變量i賦值時(shí),將13.5轉(zhuǎn)換為整數(shù)13,然后賦給i。這種轉(zhuǎn)換是由C++編譯系統(tǒng)自動(dòng)完成的,用戶不需干預(yù)。這種轉(zhuǎn)換稱為隱式類(lèi)型轉(zhuǎn)換。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.1標(biāo)準(zhǔn)類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換C++還提供顯式類(lèi)型轉(zhuǎn)換,程序人員在程序中指定將一種指定的數(shù)據(jù)轉(zhuǎn)換成另一指定的類(lèi)型,其形式為類(lèi)型名(數(shù)據(jù))
如int(89.5)其作用是將89.5轉(zhuǎn)換為整型數(shù)89。對(duì)于用戶自己聲明的類(lèi)型,編譯系統(tǒng)并不知道怎樣進(jìn)行轉(zhuǎn)換。解決這個(gè)問(wèn)題的關(guān)鍵是讓編譯系統(tǒng)知道怎樣去進(jìn)行這些轉(zhuǎn)換,需要定義專門(mén)的函數(shù)來(lái)處理。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.2用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換幾種構(gòu)造函數(shù):默認(rèn)構(gòu)造函數(shù)。以Complex類(lèi)為例,函數(shù)原型為Complex();//沒(méi)有參數(shù)用于初始化的構(gòu)造函數(shù)。函數(shù)原型的形式為Complex(doubler,doublei);//形參列表中一般有兩個(gè)以上參數(shù)用于復(fù)制對(duì)象的復(fù)制構(gòu)造函數(shù)。函數(shù)原型的形式為Complex(Complex&c);//形參是本類(lèi)對(duì)象的引用4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.2用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換轉(zhuǎn)換構(gòu)造函數(shù):只有一個(gè)形參,如Complex(doubler){real=r;imag=0;}其作用是將double型的參數(shù)r轉(zhuǎn)換成Complex類(lèi)的對(duì)象,將r作為復(fù)數(shù)的實(shí)部,虛部為0。用戶可以根據(jù)需要定義轉(zhuǎn)換構(gòu)造函數(shù),在函數(shù)體中告訴編譯系統(tǒng)怎樣去進(jìn)行轉(zhuǎn)換。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.2用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換在類(lèi)體中,可以有轉(zhuǎn)換構(gòu)造函數(shù),也可以沒(méi)有轉(zhuǎn)換構(gòu)造函數(shù),視需要而定。以上幾種構(gòu)造函數(shù)可以同時(shí)出現(xiàn)在同一個(gè)類(lèi)中,它們是構(gòu)造函數(shù)的重載。編譯系統(tǒng)會(huì)根據(jù)建立對(duì)象時(shí)給出的實(shí)參的個(gè)數(shù)與類(lèi)型選擇形參與之匹配的構(gòu)造函數(shù)。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.2用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換使用轉(zhuǎn)換構(gòu)造函數(shù)將一個(gè)指定的數(shù)據(jù)轉(zhuǎn)換為類(lèi)對(duì)象的方法如下:(1)先聲明一個(gè)類(lèi)。(2)在這個(gè)類(lèi)中定義一個(gè)只有一個(gè)參數(shù)的構(gòu)造函數(shù),參數(shù)的類(lèi)型是需要轉(zhuǎn)換的類(lèi)型,在函數(shù)體中指定轉(zhuǎn)換的方法。(3)在該類(lèi)的作用域內(nèi)可以用以下形式進(jìn)行類(lèi)型轉(zhuǎn)換:
類(lèi)名(指定類(lèi)型的數(shù)據(jù))就可以將指定類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為此類(lèi)的對(duì)象。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.2用轉(zhuǎn)換構(gòu)造函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換也可以將另一個(gè)類(lèi)的對(duì)象轉(zhuǎn)換成轉(zhuǎn)換構(gòu)造函數(shù)所在的類(lèi)對(duì)象。Teacher(Student&s){num=s.num;strcpy(name,);sex=s.sex;}4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個(gè)指定類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為類(lèi)的對(duì)象。但是不能反過(guò)來(lái)將一個(gè)類(lèi)的對(duì)象轉(zhuǎn)換為一個(gè)其他類(lèi)型的數(shù)據(jù)(例如將一個(gè)Complex類(lèi)對(duì)象轉(zhuǎn)換成double類(lèi)型數(shù)據(jù))。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換C++提供類(lèi)型轉(zhuǎn)換函數(shù)(typeconversionfunction)來(lái)解決這個(gè)問(wèn)題。類(lèi)型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類(lèi)的對(duì)象轉(zhuǎn)換成另一類(lèi)型的數(shù)據(jù)。如果已聲明了一個(gè)Complex類(lèi),可以在Complex類(lèi)中這樣定義類(lèi)型轉(zhuǎn)換函數(shù):operatordouble(){returnreal;}類(lèi)型轉(zhuǎn)換函數(shù)的一般形式為:
operator類(lèi)型名(){實(shí)現(xiàn)轉(zhuǎn)換的語(yǔ)句}4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換在函數(shù)名前面不能指定函數(shù)類(lèi)型,函數(shù)沒(méi)有參數(shù)。其返回值的類(lèi)型是由函數(shù)名中指定的類(lèi)型名來(lái)確定的。類(lèi)型轉(zhuǎn)換函數(shù)只能作為成員函數(shù),因?yàn)檗D(zhuǎn)換的主體是本類(lèi)的對(duì)象。不能作為友元函數(shù)或普通函數(shù)。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換轉(zhuǎn)換構(gòu)造函數(shù)和類(lèi)型轉(zhuǎn)換運(yùn)算符有一個(gè)共同的功能:當(dāng)需要的時(shí)候,編譯系統(tǒng)會(huì)自動(dòng)調(diào)用這些函數(shù),建立一個(gè)無(wú)名的臨時(shí)對(duì)象(或臨時(shí)變量)。例4.94.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換分析:(1)如果在Complex類(lèi)中沒(méi)有定義類(lèi)型轉(zhuǎn)換函數(shù)operatordouble,程序編譯將出錯(cuò)。(2)d=c1+c2;//d為double型變量將c1與c2兩個(gè)類(lèi)對(duì)象相加,得到一個(gè)臨時(shí)的Complex類(lèi)對(duì)象,由于它不能賦值給double型變量,而又有對(duì)double的轉(zhuǎn)換函數(shù),于是調(diào)用此函數(shù),把臨時(shí)類(lèi)對(duì)象轉(zhuǎn)換為double數(shù)據(jù),然后賦給d。4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換例4.10分析(1)如果沒(méi)有定義轉(zhuǎn)換構(gòu)造函數(shù),則此程序編譯出錯(cuò)。(2)在類(lèi)Complex中定義了轉(zhuǎn)換構(gòu)造函數(shù),并具體規(guī)定了怎樣構(gòu)成一個(gè)復(fù)數(shù)。由于已重載了算符“+”,在處理表達(dá)式c1+2.5時(shí),編譯系統(tǒng)把它解釋為operator+(c1,2.5)上面的函數(shù)調(diào)用相當(dāng)于operator+(c1,Complex(2.5))//運(yùn)行結(jié)果為(5.5+4i)4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換分析:(3)如果在Complex類(lèi)中聲明了重載運(yùn)算符“+”函數(shù)作為友元函數(shù):Complexoperator+(Complexc1,Complexc2)//定義運(yùn)算符“+”重載函數(shù){returnComplex(c1.real+c2.real,c1.imag+c2.imag);}4.8不同類(lèi)型數(shù)據(jù)間的轉(zhuǎn)換4.8.3用類(lèi)型轉(zhuǎn)換函數(shù)進(jìn)行類(lèi)型轉(zhuǎn)換分析(3)如果把“c3=c1+2.5;”改為c3=2.5+c1;程序可以通過(guò)編譯和正常運(yùn)行。
在已定義了相應(yīng)的轉(zhuǎn)換構(gòu)造函數(shù)情況下,將運(yùn)算符“+”函數(shù)重載為友元函數(shù),在進(jìn)行兩個(gè)復(fù)數(shù)相加時(shí),可以用交換律。習(xí)題1、下列運(yùn)算符不能重載為友元函數(shù)的是
A)=()[]->
B)+-++--
C)><>=<=
D)+=-=*=/=A2、關(guān)于運(yùn)算符重載,下列表述中正確的是A)C++已有的任何運(yùn)算符都可以重載B)運(yùn)算符函數(shù)的返回類(lèi)型不能聲明為基本數(shù)據(jù)類(lèi)型C)在類(lèi)型轉(zhuǎn)換符函數(shù)的定義中不需要聲明返回類(lèi)型D)可以通過(guò)運(yùn)算符重載來(lái)創(chuàng)建C++中原來(lái)沒(méi)有的運(yùn)算符C習(xí)題3、下列關(guān)于運(yùn)算符重載的敘述中,正確的是()A)通過(guò)運(yùn)算符重載,可以定義新的運(yùn)算符B)有的運(yùn)算符只能作為成員函數(shù)重載C)若重載運(yùn)算符+,則相應(yīng)的運(yùn)算符函數(shù)名是+D)重載一個(gè)二元運(yùn)算符時(shí),必須聲明兩個(gè)形參B4、下列是重載乘法運(yùn)算符的函數(shù)原型聲明,其中錯(cuò)誤的是A)MyClassoperator*(double,double);B)MyClassoperator*(double,MyClass);C)MyClassoperator*(MyClass,double);D)MyClassoperator*(MyClass,MyClass);A習(xí)題5、下列關(guān)于運(yùn)算符重載的描述中,正確的是A)運(yùn)算符重載為成員函數(shù)時(shí),若參數(shù)表中無(wú)參數(shù),重載的是一元運(yùn)算符B)一元運(yùn)算符只能作為成員函數(shù)重載C)二元運(yùn)算符重載為非成員函數(shù)時(shí),參數(shù)表中有一個(gè)參數(shù)D)C++中可以重載所有的運(yùn)算符A6、下列運(yùn)算符函數(shù)中肯定不屬于類(lèi)FunNumber的成員函數(shù)的是A)intoperator-(FunNumber);B)FunNumberoperator-();C)FunNumberoperator-(int);D)intoperator-(FunNumber,F(xiàn)unNumber);D習(xí)題7、在表達(dá)式x+y*z中,+是作為成員函數(shù)重載的運(yùn)算符,*是作為非成員函數(shù)重載的運(yùn)算符。下列敘述中正確的是A)operator+有兩個(gè)參數(shù),operator*有兩個(gè)參數(shù)B)operator+有兩個(gè)參數(shù),operator*有一個(gè)參數(shù)C)operator+有一個(gè)參數(shù),operator*有兩個(gè)參數(shù)D)operator+有一個(gè)參數(shù),operator*有一個(gè)參數(shù)C習(xí)題8、運(yùn)算符重載是對(duì)已有的運(yùn)算符賦予多重含義,因此()A)可以對(duì)基本類(lèi)型(如int類(lèi)型)的數(shù)據(jù),重新定義“+”運(yùn)算符的含義B)可以改變一個(gè)已有運(yùn)算符的優(yōu)先級(jí)和操作數(shù)個(gè)數(shù)C)只能重載C++中已經(jīng)有的運(yùn)算符,不能定義新運(yùn)算符D)C++中已經(jīng)有的所有運(yùn)算符都可以重載C習(xí)題9、下面是重載為非成員函數(shù)的運(yùn)算符函數(shù)原型,其中錯(cuò)誤的是()A)Fractionoperator+(Fraction,Fraction);B)Fractionoperator-(Fraction);C)Fraction&operator=(Fraction&,Fraction);D)Fraction&operator+=(Fraction&,Fraction);C10、通過(guò)運(yùn)算符重載,可以改變運(yùn)算符原有的()A)操作數(shù)類(lèi)型
B)操作數(shù)個(gè)數(shù)C)優(yōu)先級(jí)
D)結(jié)合性A習(xí)題11、有如下的運(yùn)算符重載函數(shù)定義:doubleoperator+(inti,intk){returndouble(i+k);}但定義有錯(cuò)誤,對(duì)這個(gè)錯(cuò)誤最準(zhǔn)確的描述是()A)+只能作為成員函數(shù)重載,而這里的+是作為非成員函數(shù)重載的B)兩個(gè)int型參數(shù)的和也應(yīng)該是int型,而這里將+的返回類(lèi)型聲明為doubleC)沒(méi)有將運(yùn)算符重載函數(shù)聲明為某個(gè)類(lèi)的友元D)C++已經(jīng)提供了求兩個(gè)int型數(shù)據(jù)之和的運(yùn)算符+,不能再定義同樣的運(yùn)算符D習(xí)題12、下面程序中對(duì)一維坐標(biāo)點(diǎn)類(lèi)Point進(jìn)行運(yùn)算符重載#include<iostream>usingnamespacestd;classPoint{public:Point(intval){x=val;}Point&operator++(){x++;return*this;}Pointoperator++(int){Point
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 債務(wù)糾紛合同(2篇)
- 公共事業(yè)資產(chǎn)管理合同
- 2025年無(wú)機(jī)械動(dòng)力飛機(jī)項(xiàng)目發(fā)展計(jì)劃
- 《職場(chǎng)溝通》電子教案 項(xiàng)目九 商務(wù)談判溝通教案
- 門(mén)店租賃協(xié)議模板
- 福州汽車(chē)租賃合同
- 廠房租賃合同書(shū)范文
- 公寓別墅租賃服務(wù)合同
- 八年級(jí)語(yǔ)文上冊(cè)第一單元5國(guó)行公祭為佑世界和平教案新人教版1
- 八年級(jí)道德與法治上冊(cè)第三單元勇?lián)鐣?huì)責(zé)任第七課積極奉獻(xiàn)社會(huì)第2框服務(wù)社會(huì)教案新人教版
- HSE基礎(chǔ)知識(shí)培訓(xùn)
- 安徽省蚌埠市2023-2024學(xué)年高一上學(xué)期期末考試 地理 含答案
- GB/T 5483-2024天然石膏
- 2024年度托管班二人合伙協(xié)議書(shū)3篇
- 山東中醫(yī)藥大學(xué)中西醫(yī)臨床(專升本)學(xué)士學(xué)位考試復(fù)習(xí)題
- 飼料加工混凝土施工合同
- 會(huì)議會(huì)務(wù)服務(wù)投標(biāo)方案投標(biāo)文件(技術(shù)方案)
- 機(jī)械結(jié)構(gòu)工程師年終總結(jié)
- 成都大學(xué)《Python數(shù)據(jù)分析》2023-2024學(xué)年期末試卷
- 2024年醫(yī)院消毒隔離制度范文(六篇)
- 2024年國(guó)家開(kāi)放大學(xué)(電大)-行政管理(本科)考試近5年真題集錦(頻考類(lèi)試題)帶答案
評(píng)論
0/150
提交評(píng)論