一、什么是操作符重載
操作符重載可以分為兩部分:“操作符”和“重載”。說到重載想必都不陌生了吧,這是一種編譯時多態,重載實際上可以分為函數重載和操作符重載。運算符重載和函數重載的不同之處在于操作符重載重載的一定是操作符。我們不妨先直觀的看一下所謂的操作符重載:
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;
}
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;
}
1.友元函數重載操作符的格式:
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;
}
在實際開發過程中,單目運算符建議重載為成員函數,而雙目運算符建議重載為友元函數。通常下雙目運算符重載為友元函數比重載為成員函數更方便,但是有時雙目運算符必須重載為成員函數,例如賦值運算符=。還有如果需要修改對象內部的狀態,一般可以選擇利用類成員函數進行修改。
三、運算符重載的原則
這樣一看,運算符重載還是蠻簡單的嘛,實際上運算符重載也是要遵循一些原則的:
1.C++中只能對已有的C++運算符進行重載,不允許用戶自己定義新的運算符。
2.C++中絕大部分的運算符可重載,除了成員訪問運算符.,作用域運算符::,長度運算符sizeof以及條件運算符?:。
3.運算符重載后不能改變運算符的操作對象(操作數)的個數。如:"+"是實現兩個操作數的運算符,重載后仍然為雙目運算符。
4.重載不能改變運算符原有的優先級和原有的結合性。
5.運算符重載不能全部是C++中預定義的基本數據,這樣做的目的是為了防止用戶修改用于基本類型數據的運算符性質。
四、為什么要進行運算符重載
關于運算符重載要遵循這么多原則,那么為什么還要進行運算符重載呢?為什么我不是寫一個add()函數,代替operator +()呢??個人感覺C++中之所以要支持運算符的重載是為了與內置數據類型統一操作,比如:c = a + b 和 c = add(a,b),這看起來哪個更直觀一點呢,顯然是前者了。同時,我們希望操作我們自己定義的數據類型能像操作int和double這些內置數據類型一樣方便??赡芘e這個加法的例子有點不好,現在加入重載的運算符是[],<<,^,|等呢?這時我們要用什么成員函數代替呢??代替之后又是一種什么效果呢?會一眼就看出來這個函數要干什么嗎??
新聞熱點
疑難解答
圖片精選