《C++程序設(shè)計》學(xué)習(xí)筆記總結(jié) - 第四章 運算符重載_第1頁
《C++程序設(shè)計》學(xué)習(xí)筆記總結(jié) - 第四章 運算符重載_第2頁
《C++程序設(shè)計》學(xué)習(xí)筆記總結(jié) - 第四章 運算符重載_第3頁
《C++程序設(shè)計》學(xué)習(xí)筆記總結(jié) - 第四章 運算符重載_第4頁
《C++程序設(shè)計》學(xué)習(xí)筆記總結(jié) - 第四章 運算符重載_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第四章運算符重載一、運算符重載的概念運算符重載的概念C++中的表達(dá)式由運算符和操作數(shù)按照規(guī)則構(gòu)成。例如,算術(shù)運算符包括加“+”、減“-”、乘“*”、除“/”和取?!埃ァ?。如果不做特殊處理,則這些算術(shù)運算符通常只能用于對基本數(shù)據(jù)類型的常量或變量進(jìn)行運算,而不能用于對象之間的運算。運算符重載,就是給已有的運算符賦予多重含義,使同一個運算符作用于不同類型的數(shù)據(jù)時產(chǎn)生不同的行為。運算符重載的目的是使得C++中的運算符也能夠用來操作對象。用于類運算的運算符通常都要重載。有兩個運算符,系統(tǒng)提供了默認(rèn)的重載版本:賦值運算符=和地址運算符&。?對于=,系統(tǒng)默認(rèn)重載為對象成員變量的復(fù)制。?對于&,系統(tǒng)默認(rèn)重載為返回任何類對象的地址??芍剌d的運算符不可重載的運算符和符號這個一定要記住,每年必考與其他函數(shù)一樣,重載運算符有一個返回類型和一個參數(shù)列表。這樣的函數(shù)稱為運算符函數(shù)。運算符可以被重載為全局函數(shù),也可以被重載為類的成員函數(shù)。聲明為全局函數(shù)時,通常應(yīng)是類的友元。故運算符函數(shù)是一種特殊的友元函數(shù)或成員函數(shù)重載運算符為類的成員函數(shù)#include<iostream>usingnamespacestd;//復(fù)數(shù)類,如:3+4i實數(shù)和虛數(shù),做加減的時候,是實數(shù)跟實數(shù)加減,虛數(shù)跟虛數(shù)加減classmyComplex{

private:

//實數(shù)跟虛數(shù)

doublereal,imag;

public:

//構(gòu)造函數(shù)

myComplex();

myComplex(doubler,doublei);

//成員函數(shù)

voidoutCom();

//成員函數(shù),減法

myComplexoperator-(constmyComplex&c);

//友元函數(shù),加法

friendmyComplexoperator+(constmyComplex&c1,constmyComplex&c2);};myComplex::myComplex(){

real=0;

imag=0;}myComplex::myComplex(doubler,doublei){

real=r;

imag=i;}voidmyComplex::outCom(){

cout<<"("<<real<<","<<imag<<")";}//減法myComplexmyComplex::operator-(constmyComplex&c){

returnmyComplex(this->real-c.real,this->imag-c.imag);}//加法,友元函數(shù)myComplexoperator+(constmyComplex&c1,constmyComplex&c2){

returnmyComplex(c1.real+c2.real,c1.imag+c2.imag);}intmain(){

myComplexc1(1,2),c2(3,4),res;

c1.outCom();

cout<<"operator+";

c2.outCom();

cout<<"=";

res=c1+c2;//對象可以做加法了

res.outCom();

cout<<endl;

c1.outCom();

cout<<"operator-";

c2.outCom();

cout<<"=";

res=c1-c2;//對象可以做減法了

res.outCom();

cout<<endl;

return0;}輸出:(1,2)operator+(3,4)=(4,6)(1,2)operator-(3,4)=(-2,-2)重載運算符為友元函數(shù)#include<iostream>usingnamespacestd;classmyComplex{

private:

doublereal,imag;

public:

myComplex();

myComplex(doubler,doublei);

voidoutCom();

//友元函數(shù)

friendmyComplexoperator+(constmyComplex&c1,constmyComplex&c2);

friendmyComplexoperator-(constmyComplex&c1,constmyComplex&c2);

friendmyComplexoperator-(constmyComplex&c1,doubler);

friendmyComplexoperator-(doubler,constmyComplex&c1);};myComplex::myComplex(){

real=0;

imag=0;}myComplex::myComplex(doubler,doublei){

real=r;

imag=i;}voidmyComplex::outCom(){

cout<<"("<<real<<","<<imag<<")";}myComplexoperator+(constmyComplex&c1,constmyComplex&c2){

//返回一個臨時對象,c1+c2

returnmyComplex(c1.real+c2.real,c1.imag+c2.imag);}myComplexoperator-(constmyComplex&c1,constmyComplex&c2){

//返回一個臨時對象,c1-c2新增

returnmyComplex(c1.real-c2.real,c1.imag-c2.imag);}myComplexoperator-(constmyComplex&c1,doubler){

//返回一個臨時對象,c1-r新增

returnmyComplex(c1.real-r,c1.imag);}myComplexoperator-(doubler,constmyComplex&c1){

//返回一個臨時對象,r-c1新增

returnmyComplex(r-c1.real,-c1.imag);}intmain(){

myComplexc1(1,2),c2(3,4),res;

c1.outCom();

cout<<"operator+";

c2.outCom();

cout<<"=";

res=c1+c2;

res.outCom();

cout<<endl;

res=c1-5;

res.outCom();

res=5-c1;

res.outCom();

return0;}輸出:(1,2)operator+(3,4)=(4,6)(-4,2)(4,-2)重載運算符的規(guī)則1)重載后運算符的含義應(yīng)該符合原有的用法習(xí)慣。例如,重載“+”運算符,完成的功能就應(yīng)該類似于做加法,在重載的“+”運算符中做減法是不合適的。2)運算符重載不能改變運算符原有的語義,包括運算符的優(yōu)先級和結(jié)合性。3)運算符重載不能改變運算符操作數(shù)的個數(shù)及語法結(jié)構(gòu)。4)不能創(chuàng)建新的運算符,即重載運算符不能超出C++語言允許重載的運算符范圍。5)重載運算符

()

[]

->

=時,只能將它們重載為成員函數(shù),不能重載為全局函數(shù)。6)運算符重載不能改變該運算符用于基本數(shù)據(jù)類型對象的含義。真題邏輯運算符兩側(cè)運算對象的數(shù)據(jù)(D)。A:是邏輯型數(shù)據(jù)B:只能是整型數(shù)據(jù)C:只能是整型或字符型數(shù)據(jù)D:可以是任何類型的數(shù)據(jù)

注:在邏輯運算中,0為假,非0為真,一般用數(shù)字1表示設(shè)x和y均為bool量,則x&&y為真的條件是(A)。A:它們均為真B:其中一個為真C:它們均為假D:其中一個為假若要對Data類中重載的加法運算符成員函數(shù)進(jìn)行聲明,下列選項中正確的是(B)A:Data+(Data);B:Dataoperator+(Data);C:Data+operator(Data);D:operator+(Data,Data);以下程序段中與語句k=a>b?1:0;功能等價的是(A)。A:if(a>b)k=1;elsek=0;B:if(a>b)k=0;C:if(a<b)k=0;elsek=1;D:if(a>b)k=1預(yù)處理命令在程序中開頭的符號是(B)。A:*B:#C:&D:@

下列運算符不能重載的是(B)。A:!B:sizeofC:newD:delete友元運算符@obj被C++編譯器解釋為(A)。A:operator@(obj)B:operator@(obj,0)C:obj.operator@()D:obj.operator@(0)下列關(guān)于運算符重載的表述中,正確的是(C)。A:C++已有的任何運算符都可以重載B:運算符函數(shù)的返回類型不能聲明為基本數(shù)據(jù)類型C:在類型轉(zhuǎn)換符函數(shù)的定義中不需要聲明返回類型D:可以通過運算符重載來創(chuàng)建C++中原來沒有的運算符下列關(guān)于運算符重載的敘述,正確的是(B)。A:通過運算符重載,可以定義新的運算符B:有的運算符只能作為成員函數(shù)重載C:若重載運算符+,則相應(yīng)的運算符函數(shù)名是+

應(yīng)該是:operator+D:重載一個二元運算符時,必須聲明兩個形參

如果是友元才是2個形參如果表達(dá)式++a中的“++”是作為成員函數(shù)重載的運算符,若采用運算符函數(shù)調(diào)用格式,則可表示為(D)A:a.operator++(1)

a++B:operator++(a)

++aC:operator++(a,1)

a++D:a.operator++()

++a

直接加1的就不需要參數(shù),省事一點,a++是先賦值再加1,復(fù)雜一點,故參數(shù)也復(fù)雜一點,多1個參數(shù)設(shè)有類A的對象Aobject,若用成員函數(shù)重載前置自增運算符,則++Aobject被編譯器解釋為(A)A:Aobject.operator++()B:operator++(Aobject)C:++(Aobject)D:Aobject::operator++()以下關(guān)于運算符重載的描述中,錯誤的是(D)。A:運算符重載其實就是函數(shù)重載B:成員運算符比友元運算符少一個參數(shù)C:需要使用關(guān)鍵字operatorD:成員運算符比友元運算符多一個參數(shù)二、重載賦值運算符C++中的賦值運算符“=”要求左右兩個操作數(shù)的類型是匹配的,或至少是賦值兼容的。有時希望“=”兩邊的操作數(shù)的類型即使不賦值兼容也能夠成立,這就需要對“=”進(jìn)行重載。C++規(guī)定,“=”只能重載為成員函數(shù)。若有類CL的兩個對象s1和s2,則它們之間的賦值語句通常是下面這樣的形式:s1=s2;當(dāng)類CL中定義了成員函數(shù),重載了賦值運算符后,上述賦值語句將解釋為函數(shù)調(diào)用的形式:s1.operator=(s2);myComplex&myComplex::operator=(constmyComplex&c1)

//這里用&完全是為了效率{

this->real=c1.real;

this->imag=c1.imag;

return*this;}myComplex&myComplex::operator=(doubler){

this->real=r;

this->imag=0;

return*this;}intmain(){

myComplexc1(1,2),c2(3,4),res;

res=c1;}淺拷貝和深拷貝平時我們用到的=都是淺拷貝,如:a=5;如果是比較麻煩的像對象=的操作,把指針?biāo)傅牡胤劫x值過去的叫深拷貝。淺拷貝:同類對象之間可以通過賦值運算符“=”互相賦值。如果沒有經(jīng)過重載,“=”的作用就是將賦值號右側(cè)對象的值一一賦值給左側(cè)的對象。這相當(dāng)于值的拷貝,稱為“淺拷貝”。深拷貝:重載賦值運算符后,賦值語句的功能是將一個對象中指針成員變量指向的內(nèi)容復(fù)制到另一個對象中指針成員變量指向的地方,這樣的拷貝叫“深拷貝”。淺拷貝示例地址不一樣,只賦值了#include<iostream>usingnamespacestd;classpointer{

public:

inta;

int*p;

pointer(){

a=100;

p=newint(10);

}

pointer(constpointer&tempp){

if(this!=&tempp){

a=tempp.a;

p=tempp.p;

}

}};intmain(){

pointerp1;

pointerp2(p1);

pointerp3=p1;

cout<<"\n初始化后,各對象的值及內(nèi)存地址"<<endl;

cout<<"對象名\t對象地址a的值p中的值p指向的值p的地址"<<endl;

cout<<"p1:\t"<<&p1<<","<<p1.a<<","<<p1.p<<","<<*p1.p<<","<<&p1.p<<endl;

cout<<"p2:\t"<<&p2<<","<<p2.a<<","<<p2.p<<","<<*p2.p<<","<<&p2.p<<endl;

cout<<"p3:\t"<<&p3<<","<<p3.a<<","<<p3.p<<","<<*p3.p<<","<<&p3.p<<endl;

*p1.p=20;

p2.a=300;

cout<<"\n修改后,各對象的值及內(nèi)存地址"<<endl;

cout<<"對象名\t對象地址a的值p中的值p指向的值p的地址"<<endl;

cout<<"p1:\t"<<&p1<<","<<p1.a<<","<<p1.p<<","<<*p1.p<<","<<&p1.p<<endl;

cout<<"p2:\t"<<&p2<<","<<p2.a<<","<<p2.p<<","<<*p2.p<<","<<&p2.p<<endl;

cout<<"p3:\t"<<&p3<<","<<p3.a<<","<<p3.p<<","<<*p3.p<<","<<&p3.p<<endl;

return0;}初始化后,各對象的值及內(nèi)存地址對象名

對象地址

a的值p中的值

p指向的值p的地址p1:

0x7ffe5ef41ac0,100,0x1316e70,10,0x7ffe5ef41ac8p2:

0x7ffe5ef41ab0,100,0x1316e70,10,0x7ffe5ef41ab8p3:

0x7ffe5ef41aa0,100,0x1316e70,10,0x7ffe5ef41aa8修改后,各對象的值及內(nèi)存地址對象名

對象地址

a的值p中的值

p指向的值p的地址p1:

0x7ffe5ef41ac0,100,0x1316e70,20,0x7ffe5ef41ac8p2:

0x7ffe5ef41ab0,300,0x1316e70,20,0x7ffe5ef41ab8p3:

0x7ffe5ef41aa0,100,0x1316e70,20,0x7ffe5ef41aa8三、重載流插入運算符和流提取運算符在C++中,左移運算符“<<”可以和cout一起用于輸出,故常被稱為“流插入運算符”。右移運算符“>>”和cin—起用于輸入,一般被稱為流提取運算符。它們都是C++類庫中提供的。在類庫提供的頭文件中已經(jīng)對“<<”和“>>”進(jìn)行了重載,使之分別作為流插入運算符和流提取運算符,能用來輸出和輸入C++基本數(shù)據(jù)類型的數(shù)據(jù)。cout是ostream類的對象,cin是istream類的對象,它們都是在頭文件iostream中聲明的。因此,凡是用“cout<<”和“cin>>”對基本數(shù)據(jù)類型數(shù)據(jù)進(jìn)行輸出/輸入的,都要用#include指令把頭文件iostream包含到本程序文件中。流插運算符必須重載為類的友元#include<iostream>usingnamespacestd;classtest{

private:

inti;

floatf;

charch;

public:

test(inta=0,floatb=0,charc='\0'){i=a;f=b;ch=c;}

friendostream&operator<<(ostream&,test);

friendistream&operator>>(istream&,test&);};ostream&operator<<(ostream&stream,testobj){

//stream是cout的別名

stream<<obj.i<<",";

stream<<obj.f<<",";

stream<<obj.ch<<endl;

returnstream;}istream&operator>>(istream&t_stream,test&obj){

//t_stream是cin的別名

t_stream>>obj.i;

t_stream>>obj.f;

t_stream>>obj.ch;

returnt_stream;}intmain(){

testA(45,8.5,'E');

operator<<(cout,A);

testB,C;

cout<<"Inputasifch:";

operator>>(cin,B);operator>>(cin,C);

operator<<(cout,B);operator<<(cout,C);}輸出:45,8.5,WInputasifch:55.8A23.4a5,5.8,A2,3.4,a四、*重載強制類型轉(zhuǎn)換運算符在C++中,類型的名字(包括類的名字)本身也是一種運算符,即強制類型轉(zhuǎn)換運算符。強制類型轉(zhuǎn)換運算符是單目運算符,也可以被重載,但只能重載為成員函數(shù),不能重載為全局函數(shù)。經(jīng)過適當(dāng)重載后,“(類型名)對象”這個對對象進(jìn)行強制類型轉(zhuǎn)換的表達(dá)式就等價于“對象.operator類型名()”,即變成對運算符函數(shù)的調(diào)用。#include<iostream>usingnamespacestd;classmyComplex{

doublereal,imag;

public:

myComplex(doubler=0,doublei=0):real(r),imag(i){};

//重載強制類型轉(zhuǎn)換運算符double

operatordouble(){

returnreal;

}};intmain(){

myComplexc(1.2,-3.4);

cout<<(double)c<<endl;//輸出1.2

doublen=12+c;

//等價于:doublen=12+c.operatordouble();

或doublen=12+(double)c;

cout<<n;//輸出:13.2

return0;}五、重載自增、自減運算符自增運算符“++”和自減運算符“--”都可以被重載,但是它們有前置和后置之分。以“++”為例,對于整數(shù)k,“++k”和“k++”的語義是不一樣的。當(dāng)“++”用于對象時,也應(yīng)該如此。例如,obj是一個類CDemo的對象,那么“++obj”和“obj++”的含義應(yīng)該是不一樣的。按照自增運算符及自減運算符的本來定義,“++obj”的返回值應(yīng)該是obj被修改后的值,而“obj++”的返回值應(yīng)該是obj被修改前的值#include<iostream>usingnamespacestd;classCDemo{

private:

intn;

public:

CDemo(inti=0):n(i){}

CDemo&operator++();//用于前置形式

CDemooperator++(int);//用于后置形式,a++會多一個參數(shù),因為先賦值再加1比較費勁

operatorint(){//重載強制轉(zhuǎn)換符

returnn;

}

friendCDemo&operator--(CDemo&);//友元函數(shù)

friendCDemooperator--(CDemo&,int);

//CDemo&operator--();如果用成員函數(shù)

//CDemooperator--(int);};//前置++CDemo&CDemo::operator++()

{

n++;

return*this;}//后置++,多一個參數(shù)CDemoCDemo::operator++(intk)

{

CDemotmp(*this);//記錄修改前的對象

n++;

returntmp;//返回修改前的對象}//前置--CDemo&operator--(CDemo&d)

{

d.n--;

returnd;}

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論