C++中的運算符重載詳解_第1頁
C++中的運算符重載詳解_第2頁
C++中的運算符重載詳解_第3頁
C++中的運算符重載詳解_第4頁
C++中的運算符重載詳解_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第C++中的運算符重載詳解目錄1、引例2、類中自動建立的函數(shù)3、重載賦值運算符解析總結

1、引例

classComplex

private:

doubleReal,Image;

public:

Complex():Real(0),Image(0){}

Complex(doubler,doublei):Real(r),Image(i){}

~Complex(){}

intmain()

Complexc1(1.2,2.3);

Complexc2(45,56);

Complexc3;

c3=c1.Add(c2);

類非常簡單,下面我們要討論如何寫一個Add函數(shù),使得兩個對象的屬性相加,返回一個新的對象。

第一種:

Complex::ComplexAdd(constComplexc)

Complexco;

co.Real=this-Real+c.Real;

co.Image=this-Image+c.Image;

returnco;

問題1:如何寫出最節(jié)省空間的Add函數(shù)?

第二種:

Complex::ComplexAdd(constComplexc)const

returnComplex(c.Real+this-Real,c.Image+this.Image);

由于不需要改變調用對象的屬性值,我們給this指針添加const修飾。

分析過程如下:

問題2:為什么第一種方式不節(jié)省空間呢?

首先第一種的代碼比較繁瑣,并且在函數(shù)棧幀中又創(chuàng)建了一個對象(第3行)。并且函數(shù)類型是值傳遞類型(第6行),返回的是一個將亡值對象。那么整個Add函數(shù)空間會產生兩個對象,造成空間的浪費。

第二中代碼創(chuàng)建的是無名對象,減少了一個co對象的創(chuàng)建,并且將無名對象直接作為將亡值對象傳遞給main函數(shù)中的c3。

問題3:我們能否將Add函數(shù)改為引用類型,這樣來減少將亡值對象的創(chuàng)建

Complex::ComplexAdd(constComplexc)const

returnComplex(c.Real+this-Real,c.Image+this.Image);

VS2025發(fā)現(xiàn)報錯,不能返回引用對象:

我們進行分析:

問題4:我們能否將這個Add函數(shù)名改為+運算符?

//Complex::ComplexAdd(constComplexc)const

Complex::Complex+(constComplexc)const

Complexco;

co.Real=this-Real+c.Real;

co.Image=this-Image+c.Image;

returnco;

intmain()

//c3=c1.Add(c2);

c3=c1.+(c2);//將原先Add的地方改變?yōu)榧犹枴?/p>

這樣使用,編譯器又會報錯,操作符不可作為一個有效的函數(shù)名來被使用。

問題5:如何使+預算符作為函數(shù)名使用?

這就引出了今天的關鍵,函數(shù)運算符重載。

在C++中,為了使操作符作為一個有效的函數(shù)名,我們在操作符前面添加一個operator。

Complexoperator+(constComplexc)const

returnComplex(c.Real+this-Real,c.Image+this-Image);

intmain()

Complexc1(1.2,2.3);

Complexc2(10,10);

Complexc3;

c3=c1+c2;

//上面一行實際上是

//c3=c1.operator+(c2);

//c3=operator+(c1,c2);//編譯器還會經過一次編譯

前面幾篇博客已經分析了第15行的由來,是將c1的地址傳遞給this指針,將c2作為形參c的別名傳遞給函數(shù)。

2、類中自動建立的函數(shù)

在C++中,如果我們定義一個類,它會給我們自動創(chuàng)建六個缺省函數(shù):

構造函數(shù)析構函數(shù)拷貝構造函數(shù)賦值函數(shù)普通對象的(取地址符)的重載常對象的(取地址符)重載

代碼示例如下:

classObject

public:

Object(){}//構造函數(shù)

~Object(){}//析構函數(shù)

Object(constObjectobj){}//拷貝構造函數(shù)

Objectoperator=(){constObjectobj}//賦值函數(shù)

return*this;

Object*operator()//普通對象的(取地址符)的重載

returnthis;

constObject*operator()const//常對象的(取地址符)重載

returnthis;

然后,在C11標準下,又增添了兩個缺省函數(shù),這里不做深究:

移動構造函數(shù)移動賦值函數(shù)

3、重載賦值運算符解析

回到最初的例子:

classObject

intvalue;

public:

Object(){

cout"create:"thisendl;

}//普通構造函數(shù)

Object(intx=0):value(x){cout"create:"thisendl;}//缺省構造函數(shù)

~Object()//析構函數(shù)

cout"~Objcet()"thisendl;

Object(Objectobj):value(obj.value)

cout"Copycreate:"thisendl;

intValue()

returnvalue;

constintValue()const

returnvalue;

Objectoperator=(constObjectobj)//此處加引用

this-value=obj.value;

return*this;//this指針指向objb的地址。賦值函數(shù)結束后,objb不會被消亡,所以可以以引用返回

voidoperator=(constObjectobj)//賦值語句不可給this指針加const

this-value=obj.value;

intmain()

Objectobjx(0);

Objectobjy(0);

objy=fun(objx);

coutobjy.Value()endl;

return0;

我們在34行添加一個等號運算符重載函數(shù):voidoperator=(constObjectobj)

此處不可添加const修飾this指針,因為需要使用this指針作為左值被修改。

問題6:voidoperator=(constObjectobj)只能用于obja=objb,為什么不可以這樣使用obja=objb=objc;

我們逐一分析:

obja=objb=objc;

//當調用等號運算符函數(shù)的時候。

obja=objb.operator=(objc);

obja=operator=(objb,objc);

//如果此處是調用的是voidoperator=(constObjectobj);

//等號從右向左指向,我們不能把一個void類型賦給一個obja對象類型。

我們將賦值運算符進行再次重載,丟棄void版本:

Objectoperator=(constObjectobj)//此處加引用

this-value=obj.value;

return*this;//this指針指向objb的地址。賦值函數(shù)結束后,objb不會被消亡,所以可以以引用返回

這樣就可以使用了。

我們接著上次的深入分析:

obja.operator=(operator=(objb,objc));

operator=(obja,operator=(objb,objc));

問題7:如果遇到obja=obja這種情況,如何賦值呢?

回答:對this指針和形參引用進行判斷。

Objectoperator=(constObjectobj)

if(this!=obj)

this-value=obj.value

問題8:為什么函數(shù)是在棧區(qū)構建的,以引用返回打印的不是一個隨機值?

運行程序,VS2012中,打印的是一個隨機值。

VS2025打印的是一個正常值。

c));

問題7:如果遇到obja=obja這種情況,如何賦值呢?

回答:對this指針和形參引用進行判斷。

```cpp

Objectoperator=(constObjectobj)

if(this!=obj)

this-v

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論