C++運算符重載的辦法具體解析。本站提示廣大學習愛好者:(C++運算符重載的辦法具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++運算符重載的辦法具體解析正文
運算符重載本質上是函數的重載
重載運算符的函數普通格局以下:
函數類型 operator 運算符稱號 (形參表列)
{對運算符的重載處置}
例如,想將“+”用於Complex(單數)的加法運算,函數的原型可所以如許的:
Complex operator + (Complex & c1,Complex &c2);
個中,operator是症結字,時刻專門用於界說重載運算符的函數的,運算符稱號就是C++供給給用戶的預定運算符。
留意:函數名是由operator和運算符構成。
下面的operator+就是函數名,意思是“對運算符+重載“。只需控制這點,這可以發明,這類函數和其他函數在情勢上沒有甚麼差別。
兩個形參是Complex類對象的援用,請求實參為Complex類對象。
在界說了重載運算符後,可以說:函數operator+重載了運算符+。
在履行單數相加的表達式c1+c2時(假定c1+c2都已被界說為Complex),體系就會挪用operator+函數,把c1+c2作為實參,與形參停止真假聯合。
為了解釋把運算符重載後,履行表達式就是挪用函數的進程,可以把兩個整數相加也想象稱為挪用上面的函數:
int operator + (int a,int b)
{
return (a+b);
}
假如有表達式5+8,就挪用此函數,將5和8作為挪用函數時的形參,函數的前往值為13,這就是經由過程函數的辦法懂得運算符。
=====================示例代碼1.1==================================
#include<iostream>
using namespace std;
class Complex
{
public:
Complex()
{
real=0;
imag=0;
}
Complex(double r,double i)
{
real=r;
imag=i;
}
Complex operator + (Complex &c2);//聲明運算符的"+"函數
void display();
private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
Complex c;
c.real=real+c2.real;
c.imag=imag+c2.imag;
return c;
}
void Complex::display()
{
cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main()
{
Complex c1(3,4),c2(5,-10),c3;
c3=c1+c2;
cout<<"c1=";
c1.display();
cout<<"c2=";
c2.display();
cout<<"c3=";
c3.display();
return 0;
}
剖析:
在main函數中,“c3=c1+c2;”在將運算符+重載為類的成員函數後,C++編譯體系將法式中的表達式c1+c2說明為:
c1.operator+(c2);//個中c1+c2是Complex類的對象
即以c2為實參挪用c1的運算符重載函數operator+(Complex & c2),停止求值,獲得兩個單數之和。下面的“operator+”是一個函數名,它是類Complex的成員函數。
在現實任務中,類的聲明和類的應用常常是分別的。假設在聲明Complex類時,對運算符+,-,*,/都停止了重載,那末應用這個類的用戶在編程時可以完整不斟酌函數是怎樣完成的,
寧神年夜膽地直接應用+,-,*,/停止單數的運算便可,明顯非常便利。
對下面的運算符重載函數operator +還可以改寫的更簡潔一些:
Complex Complex::operator+(Complex &c2)
{
return Complex(c2.real+real,c2.imag+imag);
}
return語句中的Complex(c2.real+real,c2.imag+imag)是樹立一個暫時對象,它沒有對象名,是一個無名對象。
在樹立暫時對象進程中,挪用結構函數。return語句將此暫時對象作為函數前往值。
那末,我們將+運算符停止了重載今後,能否將一個常量和一個單數相加呢?好比:
c3=3+c2; //毛病,與形參類型不婚配
這是行欠亨的,由於我們界說operator +函數的時刻,形參是兩個Complex的對象,也就是說,實參和形參婚配才可以挪用函數。
應寫成對象情勢,如:
c3=Complex(3,0)+c2; //准確,類型均為對象
還須要解釋的是:運算符被重載後,其原本的功效依然保存,沒有損失或轉變。
例如,運算符+被重載今後,依然可以用於int,float,double,char類型數據的運算,同時又增長了用於單數相加的功效。
編譯體系依據表達式的高低文,即依據運算符兩側(假如是單目運算符則為一側)的數據類型決議的。
如,關於3+5,則履行整數加法;關於3.4+5.45,則履行雙精度數加法;關於兩個單數類相加,則履行單數加法。