面面俱到 ----重載(再轉(zhuǎn))
發(fā)表時間:2023-07-26 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]面面俱到----重載作者:HolyFire面面俱到說的是一件事考慮到了很多方面。有的時候我們的一句話適用于很多方面,而這些方面有些類似。比方說加法,加法可以用于,整數(shù)和有理數(shù)。在C++里可以用兩個函...
面面俱到
----重載
作者:HolyFire
面面俱到說的是一件事考慮到了很多方面。有的時候我們的一句話適用于很多方面,而這些方面有些類似。比方說加法,加法可以用于,整數(shù)和有理數(shù)。在C++里可以用兩個函數(shù)來實現(xiàn)這個目的。
int intadd( int v1 , int v2 )
{
returnv1+v2;
}
float floatadd( float v1 , float v2 )
{
returnv1+v2;
}
使用的方式是這樣的
int ia = 1 , ib = 2 , iab = 0;
float fa = 1.0 , fb = 2.0 , fab = 0.0;
iab = intadd( ia ,ib );
fab = floatadd( fa , fb );
這樣看起來很不直觀,可讀性不強,我們的目的是讓人一眼就可以看出是在做相加運算。
聰明的讀者可能發(fā)現(xiàn),兩個函數(shù)的返回值和參數(shù)并不一樣,這樣就可以區(qū)別開兩個不同的行為。這個特性可不可以利用呢,答案是可以,C++貼心的為我們做好了一切。原理很簡單,將函數(shù)的返回值和參數(shù)用一種可逆的編碼方法變成一個字符串,安插在函數(shù)名后面,編譯器向用戶屏蔽這一切,用戶可以用同一個名字來使用不同的函數(shù)。
就是這樣
int add( int v1 , int v2 )
{
returnv1+v2;
}
float add( float v1 , float v2 )
{
returnv1+v2;
}
int ia = 1 , ib = 2 , iab = 0;
float fa = 1.0 , fb = 2.0 , fab = 0.0;
iab = add( ia ,ib );
fab = add( fa , fb );
哦~~~~,編譯通過了,結(jié)果也運行無誤。
這樣的代碼看上去要比原來的好讀多了,我們可以略過我們不感興趣的那些東西。
重載的另一個方面是可以重載運算符,不同的是,它需要使用一個關(guān)鍵字operator。這樣就可以用自己的方式來使用運算符了。那么立刻用運算符來改寫上面的一切吧
int operator + ( int v1 , int v2 )
{
returnv1+v2;
}
float operator + ( float v1 , float v2 )
{
returnv1+v2;
}
int ia = 1 , ib = 2 , iab = 0;
float fa = 1.0 , fb = 2.0 , fab = 0.0;
iab = ia + ib ;
fab = fa + fb;
哦~~~,這段代碼真是太漂亮了,可是不實用,為什么,用過C++的人都知道,象int,float這類的基本類型,本來就可以直接用運算符,那么,就來一個不是基本類型的吧。復(fù)數(shù)類在C++里可不是基本類型哦。
在這個例子里實現(xiàn)了complex類運算符+的重載,并重載了<<運算符,讓ostream可以接受complex的輸出。
改變運算符原來的意義并不是一個好主意,應(yīng)該盡量保證運算符原來的意義,我們使用它的本意就在于讓程序易讀易懂,書寫方便,iostream中的<<和>>是由于人們大量使用形成慣例后的產(chǎn)物,他們原來的意義是做移位運算。
#include <iostream>
unsing namespace std;
class complex{
private:
int real;
int image;
public:
complex( int _real = 0 , int _image = 0 ) : real(_real),image(_image) {}
int& Real(){ return real; }
int& Image(){ return image; }
complex operator + ( complex const& v )
{
complex w( real + v.real , image + v.image );
return w;
}
};
ostream& operator << ( ostream& out , complex& v )
{
if( v.Real() )
out << v.Real() ;
if( v.Image() > 0 )
cout << " + " ;
else if( v.Image() == 0 )
return cout;
else
cout << " - " ;
cout << v.Image() <<"i";
return out;
}
void main()
{
complex w( 1 , 2 ) , v( 3 , 4);
cout << (w + v) << endl;
}
代碼看起來很簡潔,可讀性很強。
我們可以看出<<失去了他原來的意義,而變成了ostream類的接口,其實重載運算符在本質(zhì)上和重載函數(shù)是一樣的。
使用重載的目的就是提高代碼的可讀性,運用得好還可以提高可復(fù)用程度。