版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章運(yùn)算符重載本章要點(diǎn)
介紹運(yùn)算符重載的概念,指出運(yùn)算符重載的實(shí)質(zhì)就是函數(shù)重載,給出運(yùn)算符重載函數(shù)定義的一般格式。通過對兩個復(fù)數(shù)相加運(yùn)算符重載的例子,我們要講解運(yùn)算符重載函數(shù)作為類的成員函數(shù)和友元函數(shù)的方法。最后分別對雙目運(yùn)算符和單目運(yùn)算符進(jìn)行了重載。特別給出單目運(yùn)算符的前置自增和后置自增的區(qū)別。轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換函數(shù)是本章的難點(diǎn)。本章內(nèi)容包括:什么是運(yùn)算符重載運(yùn)算符重載的方法運(yùn)算符重載的規(guī)則成員函數(shù)和友元函數(shù)重載重載雙目運(yùn)算符重載單目運(yùn)算符重載流插入和提取運(yùn)算符不同類型數(shù)據(jù)間的轉(zhuǎn)換4.1什么是運(yùn)算符重載(operatoroverloading)前面介紹了函數(shù)重載,同一個函數(shù)名可以代表不同功能的函數(shù)。運(yùn)算符也可以重載。5+8,5.8+3.67“+”運(yùn)算符重載能適用于int、float和double型問題:將“+”運(yùn)算符重載為復(fù)數(shù)相加?實(shí)現(xiàn):c3=c1+c2首先,定義一個專門的函數(shù)來實(shí)現(xiàn)復(fù)數(shù)相加例4.1通過函數(shù)來實(shí)現(xiàn)復(fù)數(shù)相加#include<iostream>usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexcomplex_add(Complex&c2);voiddisplay();private:doublereal;doubleimag;};ComplexComplex::complex_add(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=plex_add(c2);cout<<"c1=";c1.display();cout<<"c2=";c2.display();cout<<"c1+c2=";c3.display();return0;}構(gòu)造函數(shù)重載復(fù)數(shù)相加函數(shù),返回值類型為類類型調(diào)用c.real=real+c2.real;c.imag=imag+c2.imag;c.real=this->real+c2.real;c.imag=this->imag+c2.imag;c.real=c1.real+c2.real;c.imag=c1.imag+c2.imag;c3=plex_add(c2);4.2運(yùn)算符重載的方法運(yùn)算符重載是定義一個重載運(yùn)算符的函數(shù),在需要執(zhí)行被重載的運(yùn)算符時(shí),系統(tǒng)就自動調(diào)用該函數(shù),即執(zhí)行表達(dá)式就是調(diào)用函數(shù)的過程。運(yùn)算符重載是通過定義函數(shù)實(shí)現(xiàn)的,運(yùn)算符重載實(shí)質(zhì)上是函數(shù)的重載。一般格式:函數(shù)類型operator運(yùn)算符名稱(形參表列){對運(yùn)算符的重載處理}例如:復(fù)數(shù)加法的函數(shù)原型:Complexoperator+(Complex&c1,Complex&c2)函數(shù)名例4.2重載運(yùn)算符用于復(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;cout<<"c1=";c1.display();cout<<"c2=";c2.display();cout<<"c1+c2=";c3.display();return0;}ComplexComplex::operator+(Complex&c2){returnComplex(real+c2.real,imag+c2.imag);}在執(zhí)行本句時(shí),系統(tǒng)自動以類對象c2為實(shí)參調(diào)用c1的運(yùn)算符重載函數(shù)operator+。c1+c2解釋為:c1.operator+(c2)說明:重載運(yùn)算符是由相應(yīng)函數(shù)實(shí)現(xiàn)的,何必對運(yùn)算符重載呢?答:類的聲明和使用是分離的,所以對用戶方便。運(yùn)算符重載后,其原有的功能仍保留;C++允許用戶自定義新類型,所以必須允許運(yùn)算符重載,以擴(kuò)大C++已有運(yùn)算符的使用范圍,使其能作用于類對象,進(jìn)行賦值運(yùn)算、關(guān)系運(yùn)算、邏輯運(yùn)算和輸入輸出運(yùn)算。C++沒有為類對象重新定義一批新運(yùn)算符,而是,對現(xiàn)有運(yùn)算符進(jìn)行重載。思考題:前例中能否將一個常量和一個復(fù)數(shù)相加?
c3=3+c2;不正確;
c3=complex(3,0)+c2;正確,復(fù)數(shù)的虛部為0就是實(shí)數(shù)常量。4.3重載運(yùn)算符的規(guī)則⑴C++不允許用戶定義新的運(yùn)算符,只能對已有的運(yùn)算符進(jìn)行重載;⑵C++允許重載的運(yùn)算符有:雙目運(yùn)算符+(加),-(減),*(乘),/(除),%(取模)關(guān)系運(yùn)算符==(等于),!=(不等于),<(小于),>(大于),<=(小于等于),>=(大于大于)邏輯運(yùn)算符||(邏輯或),&&(邏輯與),&(取地址)單目運(yùn)算符+(正),-(負(fù)),*(指針),&(取地址)自增自減運(yùn)算符++(自增),--(自減)位運(yùn)算符|(按位或),&(按位與),~(按位取反),^(按位異或),<<(左移),>>(右移)賦值運(yùn)算符=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=空間申請和釋放new,delete,new[],delete[]其他運(yùn)算符()(函數(shù)調(diào)用),->(成員訪問)->*(成員指針訪問),,(逗號),[](下標(biāo))不允許重載的運(yùn)算符只有5個:.(成員訪問運(yùn)算符).*(成員指針訪問運(yùn)算符)::(域運(yùn)算符)sizeof(長度運(yùn)算符)?:(條件運(yùn)算符)⑶重載不能改變運(yùn)算符運(yùn)算對象的個數(shù);⑷重載不能改變運(yùn)算符的優(yōu)先級;⑸重載不能改變運(yùn)算符的結(jié)合性;⑹重載運(yùn)算符的函數(shù)不能有默認(rèn)的參數(shù);(否則就可改變參數(shù)個數(shù))⑺重載的運(yùn)算符必須和用戶定義的自定義類型的對象一起使用,其參數(shù)至少應(yīng)有一個是類對象;防止用戶:intoperator+(inta,intb){return(a-b);}如果有兩個參數(shù),可以都是類對象,也可以一個是類對象,一個是C++標(biāo)準(zhǔn)類型的數(shù)據(jù):Complexoperator+(inta,Complexc){return(Complex(a+c.real,c.image);}⑻用于類對象的運(yùn)算符一般必須重載,但運(yùn)算符“=”和“&”例外;⑼應(yīng)當(dāng)使重載運(yùn)算符的功能類似于該運(yùn)算符作用于標(biāo)準(zhǔn)類型數(shù)據(jù)時(shí)實(shí)現(xiàn)的功能。⑽運(yùn)算符重載函數(shù)可以是類的成員函數(shù),也可以是類的友元函數(shù),還可以是既非類的成員函數(shù)也非類的友元函數(shù)的普通函數(shù)。4.4運(yùn)算符重載函數(shù)作為類成員函數(shù)和友元函數(shù)例4.2中,operator+作為Complex類中的成員函數(shù)。+是雙目運(yùn)算符,但在該例中只有一個參數(shù),事實(shí)上有一個參數(shù)是隱含的,運(yùn)算符函數(shù)是用this指針隱式地訪問類對象的成員。c1+c2解釋為:c1.operator+(c2)例4.3將運(yùn)算符“+”重載為復(fù)數(shù)加法,重載函數(shù)不作為成員函數(shù),放在類外,作Complex的友元函數(shù)。#include<iostream.h>//usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler){real=r;imag=0;}Complex(doubler,doublei){real=r;imag=i;}
friendComplexoperator+(Complex&c1,Complex&c2);voiddisplay();private:doublereal;doubleimag;};Complexoperator+(Complex&c1,Complex&c2){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();return0;}c1+c2解釋為:operator+(c1,c2)運(yùn)算符重載函數(shù)可以是:⑴類的成員函數(shù)可以通過This指針自由地訪問本類的數(shù)據(jù)成員,少寫一個函數(shù)參數(shù)。成員函數(shù)定義:ComplexComplex::operator+(Complex&c2){returnComplex(real+c2.real,imag+c2.imag);}調(diào)用:c3=c1+c2;要求:第一個參數(shù)c1是一個類對象,而且與運(yùn)算符重載函數(shù)的返回類型相同。將一個復(fù)數(shù)和一個整數(shù)相加,如c1+i;成員函數(shù)定義:
ComplexComplex::operator+(int&i){returnComplex(real+i,imag);}調(diào)用:c3=c2+i;不能寫成:c3=i+c2;此時(shí)只能將重載函數(shù)作為友元函數(shù),不能作為成員函數(shù)。⑵類的友元函數(shù)雙目運(yùn)算符重載為友元函數(shù)時(shí),在函數(shù)的形參表列中必須有兩個參數(shù)。聲明:friendComplexoperator+(Complex&c1,Complex&c2);友元函數(shù)定義:Complexoperator+(Complex&c1,Complex&c2){returnComplex(c1.real+c2.real,c1.imag+c2.imag);}調(diào)用:c3=c1+c2;形參的順序任意,不要求第一個參數(shù)必須為類對象。要求運(yùn)算符左側(cè)的操作數(shù)與第一個參數(shù)對應(yīng),運(yùn)算符右側(cè)的操作數(shù)與第二個參數(shù)對應(yīng)。將一個復(fù)數(shù)和一個整數(shù)相加,如i+c1;聲明:friendComplexoperator+(Complex&i,Complex&c);友元函數(shù)定義:Complexoperator+(Complex&i,Complex&c){returnComplex(i+c.real,c.imag);}調(diào)用:c3=i+c2;注意:數(shù)學(xué)上的交換律不適用調(diào)用形式為:c3=c2+i時(shí),再重載運(yùn)算符“+”為:Complexoperator+(Complex&c,Complex&i){returnComplex(i+c.real,c.imag);}這樣,c3=c2+i和c3=i+c2都合法,編譯系統(tǒng)會根據(jù)表達(dá)式的形式選擇調(diào)用與之匹配的運(yùn)算符重載函數(shù)。一般地,單目運(yùn)算符重載為成員函數(shù),雙目運(yùn)算符重載為友元函數(shù)。⑶既非類的成員函數(shù)也非類的友元函數(shù)的普通函數(shù)普通函數(shù)不能訪問類的私有成員,所以很少使用。4.5重載雙目運(yùn)算符雙目運(yùn)算符有兩個操作數(shù),如:3+5,a=b,i<10等,相應(yīng)地,重載函數(shù)有兩個參數(shù)。例4.4定義一個字符串string類,用來存放不定長的字符串,重載運(yùn)算符“==”,“<”,“>”用于定義兩個字符串的等于,小于和大于的比較運(yùn)算。#include<iostream>usingnamespacestd;classString//String是用戶自己指定的類名{public:String(){p=NULL;}//默認(rèn)構(gòu)造函數(shù)String(char*str);//構(gòu)造函數(shù)voiddisplay();private:char*p;};String::String(char*str){p=str;}voidString::display(){cout<<p;}intmain(){Stringstring1("Hello"),string2("Book");string1.display();cout<<endl;string2.display();return0;}框架#include<iostream.h>#include<string.h>classString{public:String(){p=NULL;}String(char*str);
friendbooloperator>(String&string1,String&string2);voiddisplay();private:char*p;};String::String(char*str){p=str;}voidString::display(){cout<<p;}booloperator>(String&string1,String&string2){if(strcmp(string1.p,string2.p)>0)returntrue;elsereturnfalse;}intmain(){Stringstring1("Hello"),string2("Book");cout<<(string1>string2)<<endl;return0;}string1.p指向“hello”string2.p指向“book”運(yùn)算符重載函數(shù)返回值為bool,true的值為1重載運(yùn)算符“>”#include<iostream.h>#include<string.h>classString{public:String(){p=NULL;}String(char*str);friendbooloperator>(String&string1,String&string2);friendbooloperator<(String&string1,String&string2);friendbooloperator==(String&string1,String&string2);voiddisplay();private:char*p;};重載三個運(yùn)算符String::String(char*str){p=str;}voidString::display(){cout<<p;}booloperator>(String&string1,String&string2){if(strcmp(string1.p,string2.p)>0)returntrue;elsereturnfalse;}booloperator<(String&string1,String&string2){if(strcmp(string1.p,string2.p)<0)returntrue;elsereturnfalse;}booloperator==(String&string1,String&string2){if(strcmp(string1.p,string2.p)==0)returntrue;elsereturnfalse;}intmain(){Stringstring1("Hello"),string2("Book"),string3("Computer");cout<<(string1>string2)<<endl;cout<<(string1<string3)<<endl;cout<<(string1==string2)<<endl;return0;}#include<iostream.h>#include<string.h>classString{public:String(){p=NULL;}String(char*str);friendbooloperator>(String&string1,String&string2);friendbooloperator<(String&string1,String&string2);friendbooloperator==(String&string1,String&string2);voiddisplay();private:char*p;};String::String(char*str){p=str;}voidString::display(){cout<<p;}booloperator>(String&string1,String&string2){if(strcmp(string1.p,string2.p)>0)returntrue;elsereturnfalse;}booloperator<(String&string1,String&string2){if(strcmp(string1.p,string2.p)<0)returntrue;elsereturnfalse;}booloperator==(String&string1,String&string2){if(strcmp(string1.p,string2.p)==0)returntrue;elsereturnfalse;}voidcompare(String&string1,String&string2){if(operator>(string1,string2)==1){string1.display();cout<<">";string2.display();}elseif(operator<(string1,string2)==1){string1.display();cout<<"<";string2.display();}elseif(operator==(string1,string2)==1){string1.display();cout<<"=";string2.display();}cout<<endl;}intmain(){Stringstring1("Hello"),string2("Book"),string3("Computer"),string4("Hello");compare(string1,string2);compare(string2,string3);compare(string1,string4);return0;}4.6重載單目運(yùn)算符單目運(yùn)算符只有一個操作數(shù),如:!a,-b,&c,*p,++I,--i等,相應(yīng)地,重載函數(shù)有一個參數(shù)。例4.5有一個Time類,包含數(shù)據(jù)成員minute和second。要求制作秒表:滿60秒進(jìn)位分,秒歸零。#include<iostream>usingnamespacestd;classTime{public:Time(){minute=0;sec=0;}//默認(rèn)構(gòu)造函數(shù)Time(intm,ints):minute(m),sec(s){}//構(gòu)造函數(shù)重載Timeoperator++();//聲明運(yùn)算符重載函數(shù)voiddisplay(){cout<<minute<<":"<<sec<<endl;}private:intminute;intsec;};TimeTime::operator++()//成員函數(shù)重載{if(++sec>=60){sec-=60;++minute;}return*this;//返回當(dāng)前對象值}intmain(){Timetime1(34,0);for(inti=0;i<61;i++) {++time1;time1.display();}return0;}C++約定:在自增、自減運(yùn)算符重載函數(shù)中,沒有形參int是前置運(yùn)算符函數(shù),有形參int是后置運(yùn)算符函數(shù)例4.6在前例的基礎(chǔ)上增加對后置運(yùn)算符的重載#include<iostream>usingnamespacestd;classTime{public:Time(){minute=0;sec=0;}Time(intm,ints):minute(m),sec(s){}Timeoperator++();//聲明前置自增運(yùn)算符
Timeoperator++(int);//聲明后置自增運(yùn)算符voiddisplay(){cout<<minute<<":"<<sec<<endl;}private:intminute;intsec;};TimeTime::operator++(){if(++sec>=60){sec-=60;++minute;}return*this;}TimeTime::operator++(int){Timetemp(*this);sec++;if(sec>=60){sec-=60;++minute;}returntemp;}返回自加后的對象本身返回自加前的對象,然后對象自加intmain(){Timetime1(34,59),time2;cout<<"time1:";time1.display();//time原值++time1;cout<<"++time1:";time1.display();//++time后的值time2=time1++;cout<<"time1++:";time1.display();//time++后的值cout<<"time2:";time2.display();//time++前的值return0;}重載后置運(yùn)算符時(shí),多了一個int型參數(shù),增加這個參數(shù)只是為了與前置自增運(yùn)算符重載函數(shù)區(qū)別,沒有別的作用,在定義函數(shù)時(shí)也不必使用此參數(shù),因此可以省寫參數(shù)名,只需要在括號中寫int即可,編譯系統(tǒng)在遇到重載后置自增運(yùn)算符時(shí),則自動調(diào)用此函數(shù)。4.7重載流插入運(yùn)算符和流提取運(yùn)算符C++位運(yùn)算符<<(左移)和位運(yùn)算符>>(右移),系統(tǒng)在ostream中進(jìn)行了重載,用來輸入輸出C++標(biāo)準(zhǔn)類型的數(shù)據(jù)。<<重載為流插入運(yùn)算符,屬于istream類庫;>>重載為流提取運(yùn)算符,屬于ostream類庫;cin和cout分別是istream類和ostream類的對象。凡用到cout<<和cin>>對標(biāo)準(zhǔn)數(shù)據(jù)類型進(jìn)行輸入輸出的,都要#include<iostream>頭文件。用戶自己定義的類的對象,是不能直接用<<和>>來輸入和輸出的,所以必須進(jìn)行重載。對<<和>>重載的函數(shù)形式為:
istream&operator>>(istream&,自定義類&);ostream&operator<<(ostream&,自定義類&);第一個參數(shù)和函數(shù)的類型都必須是istream&或ostream&類型,第二個參數(shù)是要進(jìn)行輸入輸出操作的類。只能將重載>>和<<的函數(shù)作為友元函數(shù)或普通函數(shù),而不能定義為成員函數(shù)。4.7.1重載流插入運(yùn)算符“<<”例4.7用運(yùn)算符<<輸出復(fù)數(shù)#include<iostream.h>classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}Complexoperator+(Complex&c2);
friendostream&operator<<(ostream&,Complex&);private:doublereal;doubleimag;};“+”運(yùn)算符重載為成員函數(shù)“<<”運(yùn)算符重載為友元函數(shù)ComplexComplex::operator+(Complex&c2){returnComplex(real+c2.real,imag+c2.imag);}ostream&operator<<(ostream&output,Complex&c){output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;returnoutput;}intmain(){Complexc1(2,4),c2(6,10),c3;c3=c1+c2;
cout<<c3;return0;}對于:ostream&operator<<(ostream&output,Complex&c){output<<"("<<c.real<<"+"<<c.imag<<"i)"<<endl;returnoutput;}cout<<c3解釋為:operator<<(cout,c3)形參:&output&c,實(shí)參:coutc3函數(shù)體相當(dāng)于:cout<<"("<<c3.real<<"+"<<c3.imag<<"i)"<<endl;returncout;最后的returncout作用是返回當(dāng)前值,以便連續(xù)向輸出流插入信息。如果:cout<<c3<<c2;先處理cout<<c3,則(cout<<c3)<<c2;執(zhí)行得到新的流對象cout,cout(新值)<<c2,運(yùn)算符的左側(cè)是ostream對象,右側(cè)是Complex類對象c2,再次調(diào)用運(yùn)算符<<重載函數(shù),輸出c2的數(shù)據(jù)。注意:重載的流插入運(yùn)算符的第二個參數(shù)為Complex&c,說明只有在輸Complex對象時(shí)才能使用本重載運(yùn)算符,對其他類型的對象無效Cout<<time1;(×)4.7.2重載流提取運(yùn)算符“>>”C++運(yùn)算符>>的作用是從一個輸入輸出流中提取數(shù)據(jù)。重載的目的是輸入類的對象。例4.8在4.7的基礎(chǔ)上,增加提取運(yùn)算符>>,用cin>>輸入復(fù)數(shù),用cout輸出復(fù)數(shù)。#include<iostream.h>classComplex{public:friendostream&operator<<(ostream&,Complex&);friendistream&operator>>(istream&,Complex&);private:doublereal;doubleimag;};ostream&operator<<(ostream&output,Complex&c){output<<"("<<c.real<<"+"<<c.imag<<"i)";returnoutput;}istream&operator>>(istream&input,Complex&c){cout<<"inputrealpartandimaginarypartofcomplexnumber:";input>>c.real>>c.imag;returninput;}cin>>c1解釋為:operator>>(cin,c1)形參:&intput&c,實(shí)參:cinc1函數(shù)體相當(dāng)于cin>>c.real>>c.imag;returncin;最后的returncin的作用是返回當(dāng)前值,以便連續(xù)從輸入流提取數(shù)據(jù)給程序中的Complex類對象。intmain(){Complexc1,c2;cin>>c1>>c2;cout<<"c1="<<c1<<endl;cout<<"c2="<<c2<<endl;return0;}注意:cin>>c1>>c2;語句,每遇到一次>>就調(diào)用一次重載運(yùn)算符>>函數(shù),因此兩次提示輸入信息。觀察下列結(jié)果:ostream&operator<<(ostream&output,Complex&c){output<<"("<<c.real;if(c.imag>=0)output<<"+";output<<c.imag<<"i)";returnoutput;}修改:4.8不同類型數(shù)據(jù)間的轉(zhuǎn)換4.8.1標(biāo)準(zhǔn)類型數(shù)據(jù)間的轉(zhuǎn)換復(fù)習(xí)類型轉(zhuǎn)換:inti=6;i=7.5+i;隱式轉(zhuǎn)換int(8.9);顯式轉(zhuǎn)換問題:一個自定義的類對象能否轉(zhuǎn)換為標(biāo)準(zhǔn)類型?一個類的對象能否轉(zhuǎn)換為另一個類的對象?答:定義專門的處理函數(shù)。4.8.2轉(zhuǎn)換構(gòu)造函數(shù)默認(rèn)構(gòu)造函數(shù)Complex();//沒有參數(shù)轉(zhuǎn)換構(gòu)造函數(shù)(conversionconstructorfunction)
Complex(doubler){real=r,image=0};作用是將double型參數(shù)r轉(zhuǎn)換成Complex類對象。帶參構(gòu)造函數(shù)Complex(doubler,doublei);//用于初始化復(fù)制構(gòu)造函數(shù)Complex(Complex&c);//形參是本類對象的引用轉(zhuǎn)換構(gòu)造函數(shù)只能有一個參數(shù)參數(shù)類型:需要轉(zhuǎn)換的類型函數(shù)體:轉(zhuǎn)換方法轉(zhuǎn)換方法:類名(準(zhǔn)備轉(zhuǎn)換類型的數(shù)據(jù))隱式轉(zhuǎn)換,定義對象時(shí)Complexc1(3.5);//建立一個類對象real=3.5,image=0Complex(3.5);//聲明無名對象顯式轉(zhuǎn)換:若重載了“+”運(yùn)算符,c,c1為對象c=c1+2.5,//編譯錯誤c=c1+Complex(2.5)//正確將一個學(xué)生類對象轉(zhuǎn)換為教師類對象,轉(zhuǎn)換構(gòu)造函數(shù)為:Teacher(Student&s){num=s.num;strcpy(name,);sex=sex;}要求s中的num,name,sex是公有成員,否則不能被類外引用4.8.3類型轉(zhuǎn)換函數(shù)用轉(zhuǎn)換構(gòu)造函數(shù)可以將一個指定類型的數(shù)據(jù)轉(zhuǎn)換為類的對象。但是不能反過來進(jìn)行。類型轉(zhuǎn)換函數(shù)(typeconversionfunction)的作用是將一個類對象轉(zhuǎn)換成另一類型的數(shù)據(jù)。類型轉(zhuǎn)換函數(shù)也稱為:類型轉(zhuǎn)換運(yùn)算符函數(shù)、類型轉(zhuǎn)換運(yùn)算符重載函數(shù)、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符函數(shù)。一般形式:operator類型名(){實(shí)現(xiàn)轉(zhuǎn)換的語句}operatordouble(){returnreal;}//函數(shù)名operatordouble//將一個Complex對象轉(zhuǎn)換為一個double類型數(shù)據(jù)//其值是Complex類中數(shù)據(jù)成員real的值類型轉(zhuǎn)換函數(shù)不能指定函數(shù)類型,函數(shù)沒有參數(shù)。返回值類型是由函數(shù)名中指定的類型名來確定。類型轉(zhuǎn)換函數(shù)只能作為成員函數(shù),因?yàn)檗D(zhuǎn)換的主體是本類的對象,不能作為友元函數(shù)或普通函數(shù)。double類型經(jīng)過重載后,除了原有的含義外,還獲得新的含義——將一個Complex對象轉(zhuǎn)換為double類型數(shù)據(jù),并指定了轉(zhuǎn)換方法。轉(zhuǎn)換構(gòu)造函數(shù)和類型轉(zhuǎn)換運(yùn)算符的共同特點(diǎn):當(dāng)需要時(shí),編譯系統(tǒng)會自動調(diào)用這些函數(shù),建立一個無名的臨時(shí)對象。例4.9有類型轉(zhuǎn)換函數(shù)double,無運(yùn)算符+重載函數(shù)#include<iostream>usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}Complex(doubler,doublei){real=r;imag=i;}
operatordouble(){returnreal;}private:doublereal;doubleimag;};intmain(){Complexc1(3,4),c2(5,-10),c3;doubled1,d2=2.5;
d1=d2+c1;cout<<d1<<endl;return0;}類型轉(zhuǎn)換運(yùn)算符函數(shù)自動調(diào)用類型轉(zhuǎn)換函數(shù)本例特點(diǎn):表達(dá)式:d1=d2+c1;d2double類型數(shù)據(jù),c1是Complex類對象,無operator+重載函數(shù)。有operatordouble重載函數(shù),調(diào)用operatordouble函數(shù),把Complex對象c1轉(zhuǎn)換為double類型數(shù)據(jù),建立一個臨時(shí)的double變量,并與d2相加,最后將一個double型的值賦給d1。例4.10無類型轉(zhuǎn)換函數(shù)double,有運(yùn)算符+重載函數(shù)和轉(zhuǎn)換構(gòu)造函數(shù)#include<iostream.h>//usingnamespacestd;classComplex{public:Complex(){real=0;imag=0;}//默認(rèn)構(gòu)造函數(shù)
Complex(doubler){real=r;imag=0;}//轉(zhuǎn)換構(gòu)造函數(shù)
Complex(doubler,doublei){real=r;imag=i;}//初始化構(gòu)造函數(shù)
friendComplexoperator+(Complexc1,Complexc2);//重載運(yùn)算符+
friendostream&operator<<(ostream&,Complex&);//重載運(yùn)算符<<private:doublereal;doubleimag;};Complexoperator+(Complexc1,Complexc2){returnComplex(c1.real+c2.real,c1.imag+c2.imag);}ostream&operator<<(ostream&output,Complex&c){output<<"("<<c.real;if(c.imag>=0)output<<"+";output<<c.imag<<"i)";returnoutput;}intmain(){Complexc1(3,4),c2(5,-10),c3;doubled1,d2=2.5;c1=c2+d2;c3=d2+c2;cout<<c1<<endl;cout<<c3<<endl;return0;}本例特點(diǎn):表達(dá)式:c1
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度商鋪?zhàn)赓U與市場拓展服務(wù)協(xié)議4篇
- 科技驅(qū)動引領(lǐng)未來
- 專業(yè)建筑裝飾工程施工合作合同版B版
- 2025年度柴油銷售區(qū)域市場調(diào)研合作協(xié)議4篇
- 2025年度養(yǎng)老院場地租賃及養(yǎng)老服務(wù)合同8篇
- 2025年度茶葉電商平臺茶具批發(fā)銷售合同范本4篇
- 2025年度玩具產(chǎn)品電商銷售合作協(xié)議范本4篇
- 專業(yè)樁基砍除工程承包合同2024年
- 2025年度新型生物制藥研發(fā)合作合同范本4篇
- 2024纜車司機(jī)雇傭合同(滑雪場)
- 餐飲行業(yè)智慧餐廳管理系統(tǒng)方案
- 2025年度生物醫(yī)藥技術(shù)研發(fā)與許可協(xié)議3篇
- 電廠檢修安全培訓(xùn)課件
- 殯葬改革課件
- 血壓計(jì)保養(yǎng)記錄表
- 食品的售后服務(wù)承諾書范本范文(通用3篇)
- 新外研版九年級上冊(初三)英語全冊教學(xué)課件PPT
- 初中中考英語總復(fù)習(xí)《代詞動詞連詞數(shù)詞》思維導(dǎo)圖
- 植物和五行關(guān)系解說
- 滬教牛津版初中英語七年級下冊全套單元測試題
- 因式分解法提公因式法公式法
評論
0/150
提交評論