C++中的操作符重載具體解析。本站提示廣大學習愛好者:(C++中的操作符重載具體解析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的操作符重載具體解析正文
1、甚麼是操作符重載
操作符重載可以分為兩部門:“操作符”和“重載”。說到重載想必都不生疏了吧,這是一種編譯時多態,重載現實上可以分為函數重載和操作符重載。運算符重載和函數重載的分歧的地方在於操作符重載重載的必定是操作符。我們無妨先直不雅的看一下所謂的操作符重載:
#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兩品種型的加法盤算,這就是操作符重載了。這些內置類型的操作符重載曾經完成過了,然則假如如今我們本身寫過的類也要完成完成相似的加法運算,怎樣辦呢??好比如今如今有如許一個點類point,要完成兩個點的相加,成果是橫縱坐標都要相加,這時候候就須要我們本身寫一個操作符重載函數了。
#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;
}
2、完成操作符重載的兩種方法
操作符重載的完成方法有兩種,即經由過程“友元函數”或許“類成員函數”。
1.友元函數重載操作符的格局:
class 類名
{
friend 前往類型 operator 操作符(形參表);
};
//類外界說格局:
前往類型 operator操作符(參數表)
{
//函數體
}
2.類成員函數完成操作符重載的格局:
class 類名
{
public:
前往類型 operator 操作符(形參表);
};
//類外界說格局
前往類型 類名::operator 操作符(形參表)
{
//函數體
}
如許說吧,照樣缺乏以比擬這兩種完成方法的差別,我們分離用兩種完成方法寫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;
}
這裡不曉得年夜家看到沒有,應用友元函數重載二元操作符”-“時,情勢參數是兩個,而應用類成員函數時,情勢參數卻只要一個。這時候由於類成員函數中存在this指針,這相當於一個參數,所以類成員完成操作符重載須要的情勢參數比本來少一個,這好比:應用類成員函數完成一元操作符”-“,就不須要參數了。也恰是由於這個緣由,友元函數完成的操作符重載是無限制的,好比:[] ,(),->和 =不克不及應用友元函數完成運算符的重載。
在現實開辟進程中,單目運算符建議重載為成員函數,而雙目運算符建議重載為友元函數。平日下雙目運算符重載為友元函數比重載為成員函數更便利,然則有時雙目運算符必需重載為成員函數,例如賦值運算符=。還有假如須要修正對象外部的狀況,普通可以選擇應用類成員函數停止修正。
3、運算符重載的准繩
如許一看,運算符重載照樣蠻簡略的嘛,現實上運算符重載也是要遵守一些准繩的:
1.C++中只能對已有的C++運算符停止重載,不許可用戶本身界說新的運算符。
2.C++中絕年夜部門的運算符可重載,除成員拜訪運算符.,感化域運算符::,長度運算符sizeof和前提運算符?:。
3.運算符重載後不克不及轉變運算符的操尴尬刁難象(操作數)的個數。如:"+"是完成兩個操作數的運算符,重載後依然為雙目運算符。
4.重載不克不及轉變運算符原本的優先級和原本的聯合性。
5.運算符重載不克不及全體是C++中預界說的根本數據,如許做的目標是為了避免用戶修正用於根本類型數據的運算符性質。
4、為何要停止運算符重載
關於運算符重載要遵守這麼多准繩,那末為何還要停止運算符重載呢?為何我不是寫一個add()函數,取代operator +()呢??小我感到C++中之所以要支撐運算符的重載是為了與內置數據類型同一操作,好比:c = a + b 和 c = add(a,b),這看起來哪一個更直不雅一點呢,明顯是前者了。同時,我們願望操作我們本身界說的數據類型能像操作int和double這些內置數據類型一樣便利。能夠舉這個加法的例子有點欠好,如今參加重載的運算符是[],<<,^,|等呢?這時候我們要用甚麼成員函數取代呢??取代以後又是一種甚麼後果呢?會一眼就看出來這個函數要干甚麼嗎??