C++中的操作符重載詳細解析
一、什么是操作符重載
操作符重載可以分為兩部分:“操作符”和“重載”。說到重載想必都不陌生了吧,這是一種編譯時多態(tài),重載實際上可以分為函數(shù)重載和操作符重載。運算符重載和函數(shù)重載的不同之處在于操作符重載重載的一定是操作符。我們不妨先直觀的看一下所謂的操作符重載:
#include <iostream>
using namespace std;
int main()
{
int a = 2 , b = 3;
float c = 2.1f , d = 1.2f;
cout<<"a + b = "<<a+b<<endl;
cout<<"c + d = "<<c+d<<endl;
return 0;
}
我們看到操作符“+”完成float和int兩種類型的加法計算,這就是操作符重載了。這些內(nèi)置類型的操作符重載已經(jīng)實現(xiàn)過了,但是如果現(xiàn)在我們自己寫過的類也要實現(xiàn)實現(xiàn)類似的加法運算,怎么辦呢??比如現(xiàn)在現(xiàn)在有這樣一個點類point,要實現(xiàn)兩個點的相加,結(jié)果是橫縱坐標都要相加,這時候就需要我們自己寫一個操作符重載函數(shù)了。
#include <iostream>
using namespace std;
class point
{
double x;
double y;
public:
double get_x()
{
return x;
}
double get_y()
{
return y;
}
point(double X = 0.0 , double Y = 0.0):x(X),y(Y){};
point operator +(point p);
};
//重載操作符“+”
point point::operator +(point p)
{
double x = this->x + p.x;
double y = this->y + p.y;
point tmp_p(x,y);
return tmp_p;
}
int main()
{
point p1(1.2,3.1);
point p2(1.1,3.2);
point p3 = p1+p2;
cout<<p3.get_x()<<" "<<p3.get_y()<<endl;
return 0;
}
二、實現(xiàn)操作符重載的兩種方式
操作符重載的實現(xiàn)方式有兩種,即通過“友元函數(shù)”或者“類成員函數(shù)”。
1.友元函數(shù)重載操作符的格式:
class 類名
{
friend 返回類型 operator 操作符(形參表);
};
//類外定義格式:
返回類型 operator操作符(參數(shù)表)
{
//函數(shù)體
}
2.類成員函數(shù)實現(xiàn)操作符重載的格式:
class 類名
{
public:
返回類型 operator 操作符(形參表);
};
//類外定義格式
返回類型 類名::operator 操作符(形參表)
{
//函數(shù)體
}
這樣說吧,還是不足以比較這兩種實現(xiàn)方式的區(qū)別,我們分別用兩種實現(xiàn)方式寫point類的”+“和”-“的重載。代碼如下:
#include <iostream>
using std::endl;
using std::cout;
class point
{
double x;
double y;
public:
double get_x()
{
return x;
}
double get_y()
{
return y;
}
point(double X = 0.0 , double Y = 0.0):x(X),y(Y){};
friend point operator -(point p1,point p2);
point operator +(point p);
};
//重載操作符“-”
point operator -(point p1,point p2)
{
double x = p1.get_x() - p2.get_x();
double y = p1.get_y() - p2.get_y();
point p3(x,y);
return p3;
}
//重載操作符“+”
point point::operator +(point p)
{
double x = this->x + p.x;
double y = this->y + p.y;
point tmp_p(x,y);
return tmp_p;
}
int main()
{
point p1(1.2,3.2);
point p2(1.1,3.1);
point p3 = p1+p2;
point p4 = operator-(p1,p2);
cout<<p3.get_x()<<" "<<p3.get_y()<<endl;
cout<<p4.get_x()<<" "<<p4.get_y()<<endl;
return 0;
}
這里不知道大家看到?jīng)]有,利用友元函數(shù)重載二元操作符”-“時,形式參數(shù)是兩個,而利用類成員函數(shù)時,形式參數(shù)卻只有一個。這時因為類成員函數(shù)中存在this指針,這相當于一個參數(shù),所以類成員實現(xiàn)操作符重載需要的形式參數(shù)比原來少一個,這比如:利用類成員函數(shù)實現(xiàn)一元操作符”-“,就不需要參數(shù)了。也正是因為這個原因,友元函數(shù)實現(xiàn)的操作符重載是有限制的,比如:[] ,(),->和 =不能利用友元函數(shù)實現(xiàn)運算符的重載。
在實際開發(fā)過程中,單目運算符建議重載為成員函數(shù),而雙目運算符建議重載為友元函數(shù)。通常下雙目運算符重載為友元函數(shù)比重載為成員函數(shù)更方便,但是有時雙目運算符必須重載為成員函數(shù),例如賦值運算符=。還有如果需要修改對象內(nèi)部的狀態(tài),一般可以選擇利用類成員函數(shù)進行修改。
三、運算符重載的原則
這樣一看,運算符重載還是蠻簡單的嘛,實際上運算符重載也是要遵循一些原則的:
1.C++中只能對已有的C++運算符進行重載,不允許用戶自己定義新的運算符。
2.C++中絕大部分的運算符可重載,除了成員訪問運算符.,作用域運算符::,長度運算符sizeof以及條件運算符?:。
3.運算符重載后不能改變運算符的操作對象(操作數(shù))的個數(shù)。如:"+"是實現(xiàn)兩個操作數(shù)的運算符,重載后仍然為雙目運算符。
4.重載不能改變運算符原有的優(yōu)先級和原有的結(jié)合性。
5.運算符重載不能全部是C++中預定義的基本數(shù)據(jù),這樣做的目的是為了防止用戶修改用于基本類型數(shù)據(jù)的運算符性質(zhì)。
四、為什么要進行運算符重載
關于運算符重載要遵循這么多原則,那么為什么還要進行運算符重載呢?為什么我不是寫一個add()函數(shù),代替operator +()呢??個人感覺C++中之所以要支持運算符的重載是為了與內(nèi)置數(shù)據(jù)類型統(tǒng)一操作,比如:c = a + b 和 c = add(a,b),這看起來哪個更直觀一點呢,顯然是前者了。同時,我們希望操作我們自己定義的數(shù)據(jù)類型能像操作int和double這些內(nèi)置數(shù)據(jù)類型一樣方便。可能舉這個加法的例子有點不好,現(xiàn)在加入重載的運算符是[],<<,^,|等呢?這時我們要用什么成員函數(shù)代替呢??代替之后又是一種什么效果呢?會一眼就看出來這個函數(shù)要干什么嗎??
上一篇:STL各個容器性能詳細比較
欄 目:C語言
下一篇:stl容器set,map,vector之erase用法與返回值詳細解析
本文標題:C++中的操作符重載詳細解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4085.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10深入理解鏈表的各類操作詳解
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文