C++基礎之運算符重載

1、運算符重載的概念

⚫ C++中的表達式由運算符和操做數按照規則構成。例如,算術運算符包括加「+」、減「-」 、乘「*」 、除「/」和取模「%」。若是不作特殊處理,則這些算術運算符一般只能用於對基本數據類型的常量或變量進行運算,而不能用於對象之間的運算。
運算符重載,就是給已有的運算符賦予多重含義,使同一個運算符做用於不一樣類型的數據時產生不一樣的行爲。運算符重載的目的是使得C++中的運算符也可以用來操做對象。
⚫ 用於類運算的運算符一般都要重載。有兩個運算符,系統提供了默認的重載版本:賦值運算符=地址運算符&ios

 

 

二、重載運算符的規則

  • 1)重載後運算符的含義應該符合原有的用法習慣。例如,重載「+」運算符,完成的功能就應該相似於作加法,在重載的「+」運算符中作減法是不合適的。
  • 2)運算符重載不能改變運算符原有的語義,包括運算符的優先級和結合性。
  • 3)運算符重載不能改變運算符操做數的個數及語法結構。
  • 4)不能建立新的運算符,即重載運算符不能超出C++語言容許重載的運算符範圍。
  • 5)重載運算符「( )」「[ ]」「->」或者賦值運算符「=」時,只能將它們重載爲成員函數,不能重載爲全局函數。
  • 6)運算符重載不能改變該運算符用於基本數據類型對象的含義。

 三、賦值運算符的重載函數

  • C++中的賦值運算符「=」要求左右兩個操做數的類型是匹配的,或至少是賦值兼容的。有時但願「=」兩邊的操做數的類型即便不賦值兼容也可以成立,這就須要對「=」進行重載。C++規定,「=」只能重載爲成員函數。如有類CL的兩個對象s1和s2,則它們之間的賦值語句一般是下面這樣的形式:s1=s2;當類CL中定義了成員函數,重載了賦值運算符後,上述賦值語句將解釋爲函數調用的形式:s1.operator=(s2);

四、淺拷貝和深拷貝this

  • 同類對象之間能夠經過賦值運算符「=」互相賦值。若是沒有通過重載,「=」的做用就是將賦值號右側對象的值一一賦值給左側的對象。這至關於值的拷貝,稱爲「淺拷貝」。
  • 重載賦值運算符後,賦值語句的功能是將一個對象中指針成員變量指向的內容複製到另外一個對象中指針成員變量指向的地方,這樣的拷貝叫「深拷貝」

五、重載流插入運算符和流提取運算符spa

  • 在C++中,左移運算符「<<」能夠和cout一塊兒用於輸出,故常被稱爲「流插入運算符」。右移運算符「>>」和cin—起用於輸入,通常被稱爲流提取運算符。它們都是C++類庫中提供的。在類庫提供的頭文件中已經對「<<」和「>>」進行了重載,使之分別做爲流插入運算符和流提取運算符,能用來輸出和輸入C++基本數據類型的數據。cout是ostream類的對象,cin是istream類的對象,它們都是在頭文件iostream中聲明的。所以,凡是用「cout<<」和「cin>>」對基本數據類型數據進行輸出/輸入的,都要用#include指令把頭文件iostream包含到本程序文件中。
  • 必須重載爲類的友元
#include<iostream>
#include<typeinfo>
using namespace std;
class Point  
{  
private:  
    int x; 
public:  
    Point(int x1){x=x1;}  
    int get();
    Point operator++();
    Point operator++(int x);
    Point operator--();  
    Point operator--(int x);
    void operator+(const Point &p);
    void operator-(const Point &p);
    Point& operator=(const Point &p);
    operator double();
    friend void operator<<(ostream & stream,Point obj);
}; 
int Point::get(){
    return this->x;
} 
//重載運算符(++obj)
Point Point::operator++(){
    x++;
    return *this;
}
//重載運算符(obj++)
Point Point::operator++(int x){
    Point temp = *this;
    this->x++;
    return temp;
}
//重載運算符(--obj)
Point Point::operator--(){
    this->x--;
    return *this;
}
//重載運算符(obj--)
Point Point::operator--(int x){
    Point temp = *this;
    this->x--;
    return temp;
}
//重載運算符+(a+b)
void Point::operator+(const Point &p){
    this->x=this->x+p.x;
}
//重載運算符-(a-b)
void Point::operator-(const Point &p){
    this->x=this->x-p.x;
}
//複製運算符重載=(a=b),賦值運算符必須重載爲成員函數
Point& Point::operator=(const Point &p){
    this->x=p.x;
    return *this;
}
//重載類型轉換運算符()a
Point::operator double(){
     cout << "重載類型轉換運算符" << endl;
     return this->x;
}
//重載運算符 (cout <<)
void operator<<(ostream & stream,Point obj){
    stream<< obj.x <<endl;
}

int main(){
    Point point(10);
    operator<<(cout, point.operator++());//11
    Point point2(10);
    operator<<(cout, point2.operator++(0));//10

    Point point3(10);
    operator<<(cout, point3.operator--());//9
    Point point4(10);
    operator<<(cout, point4.operator--(0));//10

    Point point5(1);
    Point point6(1);
    point5.operator+(point6);
    operator<<(cout, point5);//2

    point5.operator-(point6);
    operator<<(cout, point5);//1

    Point point7(1);
    Point point8(5);
    operator<<(cout, point7.operator=(point8));//5

    Point point9(20);
    cout << typeid(point9.get()).name()<< endl;//i
    cout << point9.operator double()<< endl;
    cout << typeid(point9.operator double()).name();//d
    return 0;
}
相關文章
相關標籤/搜索