C++重載操作符operator


operator是C++關鍵字,用於對C++進行擴展;

1、可以被重載的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,>,+=,<<,>>,<<=,>>=,++,!=,<=,>=,&&,||,++,--,->*,->,(),[]

不可以被重載的操作符:.  .* :: ?:

2、基類對賦值操作符(=)重載不能被派生類繼承。

“+”操作符重載:通常,重載一個二元操作符,操作符重載函數只有一個參數。重載一個一元操作符,其函數不需要任何參數。

3、重載不能改變操作符的優先級和語法。

4、[],=,(),->  必須以類成員函數的形式進行重載。

5、除內存管理操作符new,new[],delete,delete[],一個以頂層函數形式被重載的操作符必須在他的參數表中包含一個類的對象。操作符以頂層函數實現時,至少帶一個類對象參數的理由:讓編譯系統區分操作符是內建還是用戶自定義的。

  頂層函數:C++中有很多包含頭文件,也包含很多庫函數,頂層函數是object庫函數。頂層函數重載操作符時,比用成員函數重載操作符時多一個參數。只要定義了可用於轉型的構造函數,使用頂層函數進行重載的一個優點就是非對象操作符可以出現在操作符的左邊。而使用類成員函數時,第一個操作符必須是類的對象。

      一個類的friend函數可以訪問該類的私有成員和保護成員。但該friend函數不是類的成員函數。其可以出現在類的private、public、protected的任意部分。(僅在重載操作符時使用friend函數)。

重載operator++操作符

      C++語言得到了擴展,允許重載increment 和 decrement操作符的兩種形式。 
  然而有一個句法上的問題,重載函數間的區別決定於它們的參數類型上的差異,但是不論是increment或decrement的前綴還是后綴都只有一個參數。為了解決這個語言問題,C++規定后綴形式有一個int類型參數,當函數被調用時,編譯器傳遞一個0做為int參數的值給該函數:

      

class UPInt { // "unlimited precision int"
public:
 UPInt& operator++(); // ++ 前綴
 const UPInt operator++(int); // ++ 后綴
 UPInt& operator--(); // -- 前綴
 const UPInt operator--(int); // -- 后綴
 UPInt& operator+=(int); // += 操作符,UPInts
 // 與ints 相運算
 ...
};

UPInt i;

++i; // 調用 i.operator++();
i++; // 調用 i.operator++(0);
--i; // 調用 i.operator--();
i--; // 調用 i.operator--(0);

這個規范有一些古怪,不過你會習慣的。而尤其要注意的是這些操作符前綴與后綴形式返回值類型是不同的。前綴形式返回一個引用,后綴形式返回一個const類型。下面我們將討論++操作符的前綴與后綴形式,這些說明也同樣使用與--操作符。

從你開始做C程序員那天開始,你就記住increment的前綴形式有時叫做“增加然后取回”,后綴形式叫做“取回然后增加”。這兩句話非常重要,因為它們是increment前綴與后綴的形式上的規范。 

#include<iostream>
using namespace std;
class A
{
public:
    A():value(0){cout<<"i am gouzao"<<endl;}
    A(A&):value(0){cout<<"i am gouzao"<<endl;};
    ~A(){cout<<"xigou"<<endl;}
    A& operator++()
    {
    cout<<"++A"<<endl;
    ++value;
    return *this;
    }
    const A operator++(int)
    {
    cout<<"A++"<<endl;
    A tmp=*this;
    value++;
    return tmp;
    }
    void show()
    {
    cout<<"value:"<<value<<endl;
    }
private:
    int value;
};
int main()
{
    A a;
    a++;
    a.show();
    ++a;
    a.show();
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM