C++程序設(shè)計(jì)-華南理工大學(xué) 第9章-運(yùn)算符重載_第1頁
C++程序設(shè)計(jì)-華南理工大學(xué) 第9章-運(yùn)算符重載_第2頁
C++程序設(shè)計(jì)-華南理工大學(xué) 第9章-運(yùn)算符重載_第3頁
C++程序設(shè)計(jì)-華南理工大學(xué) 第9章-運(yùn)算符重載_第4頁
C++程序設(shè)計(jì)-華南理工大學(xué) 第9章-運(yùn)算符重載_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章運(yùn)算符重載面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)9.1什么是運(yùn)算符重載?9.1.1什么是運(yùn)算符重載?inti=10;i<<2;//這個<<是左移運(yùn)算符;cout<<“helloworld”;//這個“<<”是什么?9.1.1什么是運(yùn)算符重載?(續(xù))原型定義(Fromostream.h):inlineostream&ostream::operator<<(constunsignedchar*_s){returnoperator<<((constchar*)_s);}

cout<<“helloworld”;

cout.operator<<(“helloworld”);9.1.1什么是運(yùn)算符重載?(續(xù))運(yùn)算符重載:

是一個按特殊格式(operator@)聲明的函數(shù),從而改變了內(nèi)部運(yùn)算符@的含義。9.2運(yùn)算符重載的語法9.2.1語法typeclassname::operator@(arg_list)或typeoperator@(arg_list)函數(shù)返回值保留字被重載的運(yùn)算符形式參數(shù)函數(shù)返回值類名保留字被重載的運(yùn)算符形式參數(shù)classComplex{private:doublerpart;doubleipart;public:Complex(){rpart=ipart=0.0;}

Complex(double

rp,double

ip){

rpart=rp;ipart=ip;}Complexadd(constComplex&com){Complextemp;

temp.rpart=com.rpart+rpart;

temp.ipart=com.ipart+ipart;returntemp;}

};例1:復(fù)數(shù)相“加”(普通成員函數(shù)實(shí)現(xiàn))voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;C3=C2.add(C1);//要是能寫成C3=C1+C2就好了}classComplex{private:doublerpart;doubleipart;public:Complex(){rpart=ipart=0.0;}

Complex(double

rp,double

ip){rpart=rp;ipart=ip;}

ComplexOperator+(constComplex&com){Complextemp;

temp.rpart=com.rpart+rpart;

temp.ipart=com.ipart+ipart;returntemp;}};例2:復(fù)數(shù)相“加”(特殊成員函數(shù)/重載“+”實(shí)現(xiàn))voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;

C3=C2+C1;}C3=C2+C1;C3=C2.operator+(C1)例3:復(fù)數(shù)相“加”(重載“+”實(shí)現(xiàn)/外部函數(shù))classComplex{private:doublerpart;doubleipart;public:Complex(){

rpart=ipart=0.0;}

Complex(double

rp,double

ip){

rpart=rp;ipart=ip;}

friendComplexOperator+(constComplex&com1,constComplex&com2);};Complexoperator+(constComplex&com1,constComplex&com2){Complextemp;

temp.rpart=com1.rpart+com2.rpart;

temp.ipart=com1.ipart+com2.ipart;returntemp;}

voidmain(){ComplexC1(2.0,3.0);ComplexC2(5.0,4.0);ComplexC3;

C3=C2+C1;}C3=C2+C1C3=Operator+(C2,C1)注意形參跟內(nèi)部成員函數(shù)的區(qū)別9.2.2小結(jié)1.運(yùn)算符重載只是一種“語法上的方便”(語法糖);實(shí)質(zhì)上是另一種函數(shù)調(diào)用的方式。

C1+C2C1.operator+(C2)2.參數(shù)列表中的參數(shù)個數(shù)取決于:

1)運(yùn)算符是一元的還是二元的;

2)被定義為全局函數(shù)還是成員函數(shù);

C1+C2C1.operator+(C2)C1+C2operator+(C1,C2)

3)對單目后綴運(yùn)算符,需傳遞一個int常量(啞元常量值)C1++C1.operator++(1)++C1C1.operator++()9.2.2小結(jié)(續(xù))3.運(yùn)算符重載的限制:

1)不能改變內(nèi)部算符的優(yōu)先級、結(jié)合順序及運(yùn)算符的目數(shù);

C1+C2*C3C1+(C2*C3)C1+C2.operator*(C3)C1.operator+(C2.operator*(C3))

2).,*,::,?:,

sizeof五種運(yùn)算符不能重載。

3)重載=,[],(),->

都必須是非靜態(tài)的成員函數(shù),目的是保證它們的第一個操作數(shù)是一個自定義對象,從而阻止改變這些運(yùn)算符作用在基本數(shù)據(jù)類型上的含義的企圖。

a[];//如果調(diào)用的是重載的[],則a一定是自定

//義類型的對象9.2.3例:重載++classinteger{

inti;public:

integer(intii){i=ii;}integeroperator++(){//前綴++i++;return*this;}integeroperator++(int){//后綴++,添加一個啞元

integertemp=*this;i++;returntemp;}};voidmain(){integera(1),b(2);b=a++;b=++a;}9.3自定義類型轉(zhuǎn)換9.3.1引言問題:如何實(shí)現(xiàn)complex+double或double+complex?方法一:內(nèi)部函數(shù):complexcomplex::operator+(complex);內(nèi)部函數(shù):complexcomplex::operator+(double);外部函數(shù):complexoperator+(double,complex)方法二:轉(zhuǎn)換構(gòu)造函數(shù):T->X轉(zhuǎn)換,如:double->Complex

則定義函數(shù):complexcomplex::complex(constdouble);

9.3.2轉(zhuǎn)換構(gòu)造函數(shù)定義double->Complex的轉(zhuǎn)換,實(shí)現(xiàn):double+Complex,Complex+double,Complex+Complex:classComplex{friendint

operator+(constComplex&c1,constComplex&c2);

Complex(constdouble&d){

rpart=d;

ipart=0.0;}…};例:3.0+Complex,將3.0轉(zhuǎn)換成臨時的復(fù)數(shù)對象。9.3.3轉(zhuǎn)換運(yùn)算符定義轉(zhuǎn)換運(yùn)算符函數(shù)X::operatorT(){//…;};實(shí)現(xiàn)類X->T(通常是內(nèi)部類型)的轉(zhuǎn)換。Complex->doubledoubleComplex::operatordouble(){returnrpart;}Complexc1(5.5,1.1);doubletemp=1.0;temp=temp+c1;temp=temp+double(c1);9.3.4二義性問題若同時定義了轉(zhuǎn)換運(yùn)算符合轉(zhuǎn)換構(gòu)造函數(shù),會引起二義性。classX{

inti;public:friendXoperator+(constX&,constX&);

X(intii){i=ii;}//轉(zhuǎn)換構(gòu)造函數(shù)operatorint(){returni;}//轉(zhuǎn)換運(yùn)算符};Xoperator+(constX&,constX){returnX(x1.i+x2.i);}voidmain(){Xx1(10);

inti=x1+x2;//二義性i=12+x1;//二義性}9.3.5重載運(yùn)算符參數(shù)匹配規(guī)則1.如果正好匹配,則不必進(jìn)行轉(zhuǎn)換,或者簡單的調(diào)整(如:數(shù)組名轉(zhuǎn)為指針,函數(shù)名轉(zhuǎn)為函數(shù)指針,類型T轉(zhuǎn)為constT);2.如果不匹配,則試著將char轉(zhuǎn)為int,short轉(zhuǎn)為int,float轉(zhuǎn)為double;3.如果仍不匹配,則進(jìn)行標(biāo)準(zhǔn)轉(zhuǎn)換(例如,把int

轉(zhuǎn)為double,指向派生類的指針轉(zhuǎn)為指向基類的指針,unsignedint

轉(zhuǎn)為int)4.如果還不匹配,則使用用戶定義的轉(zhuǎn)換(包括轉(zhuǎn)換構(gòu)造函數(shù)和轉(zhuǎn)換算符).5.如果不匹配,且函數(shù)參數(shù)中有…,則用…來匹配任意參數(shù).6.否則,因類型不匹配而出錯.注:以上規(guī)則適用于所有的重載函數(shù).9.4重要應(yīng)用舉例9.4.1重載賦值運(yùn)算符classMessage{

char*buffer;

intsize;public:

Message(int

sz=256);

Message(constMessage&msg);Message&operator=(constMessage&msg);

void

setmessage(constchar*buf);

constchar*getmessage()const;

virtual~Message();};Message::Message(int

sz){size=sz; buffer=newchar[size];buffer[0]=‘\0’;}Message::~Message(){

delete[]buffer;}constchar*Message::getmessage()const{

returnbuffer;}void

Message::setmessage(const

char*buf){

strcpy(buffer,buf);}//拷貝構(gòu)造函數(shù)Message::Message(constMessage&msg){size=msg.size; buffer=new

char[size];

strcpy(buffer,msg.buffer);}Message&Message::operator=(constMessage&msg){

if(this!=&msg){

delete[]buffer;size=msg.size; buffer=new

char[size];

strcpy(buffer,msg.buffer); }

return*this;//返回*this的引用目的是實(shí)現(xiàn)鏈?zhǔn)劫x值}int

main(int

argc,char*argv[]){Messagemsg(100);

msg.setmessage("IamRick");

cout<<msg.getmessage()<<endl;Messagemsg2(msg);

cout<<msg2.getmessage()<<endl; Messagemsg3; msg3=msg2=msg;//鏈?zhǔn)劫x值

cout<<msg3.getmessage()<<endl;// strcpy(msg.getmessage(),"IamMike");error!!

return0;}Msg3.operator=(msg2.operator=(msg))什么是安全的類?如何設(shè)計(jì)一個安全的類?一個安全的類,通常須有幾個特殊的成員函數(shù):構(gòu)造函數(shù):正確初始化對象;析構(gòu)函數(shù):正確回收對象的空間;拷貝構(gòu)造函數(shù):正確實(shí)現(xiàn)用對象去初始化對象;重載賦值運(yùn)算符:正確實(shí)現(xiàn)對象間的賦值。#include<iostream.h>classMyComplex{public: doublerpart; doubleipart; staticintcount;

MyComplex(){

rpart=ipart=0.0;count++;

cout<<"生成對象:"<<this<<"初始化構(gòu)造函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;}

MyComplex(MyComplex&h){ ++count;

rpart=h.rpart;

ipart=h.ipart;

cout<<"生成對象:"<<this<<"拷貝構(gòu)造函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;} ~MyComplex(){--count;

cout<<"撤消對象:"<<this<<"析構(gòu)函數(shù)"<<"rpart="<<rpart<<"Count="<<count<<endl;}

MyComplex

operator+(const

MyComplex&com){

cout<<"進(jìn)入重載+"<<endl;

MyComplextemp;

temp.rpart=rpart+com.rpart;

temp.ipart=ipart+com.ipart; returntemp;}

MyComplex&operator=(constMyComplex&com){

cout<<"重載賦值運(yùn)算符"<<endl;

ipart=com.ipart;

rpart=com.rpart; return*this; }

MyComplex(double

rp,doubleip){

cout++;

rpart=rp;

ipart=ip;

cout<<"生成對象:"<<this<<"初始化構(gòu)造函數(shù)"<<"rpart="<<rpart<<"count="<<count<<endl;}};int

MyComplex::count=0;int

main(int

argc,char*argv[]){

MyComplexa(1,1),b(2,2),c(3,3),d(4,4);

cout<<"================================"<<endl;

MyComplex&e=c+d;

MyComplexf=d;

MyComplexg;

cout<<"================================"<<endl;g=d; return0;}9.4.2重載[]實(shí)現(xiàn)關(guān)聯(lián)數(shù)組class

Ctuition{

inttotal[5];public:

Ctuition(){total[0]=5000;//“CS”total[1]=5000;//“EE”…;}voidSetTuition(constchar*dept,intt){

inti;if(dept==“CS”)i=0;elseif(dept==“EE”)i=1;…;

total[i]=t;}

int

GetTuition(constchar*dept){if(dept==“CS”)i=0;

溫馨提示

  • 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

提交評論