程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 運算符重載詳解,運算符重載

運算符重載詳解,運算符重載

編輯:C++入門知識

運算符重載詳解,運算符重載


一般運算符重載

在進行對象之間的運算時,程序會調用與運算符相對應的函數進行處理,所以運算符重載有兩種方式:成員函數和友元函數。成員函數的形式比較簡單,就是在類裡面定義了一個與操作符相關的函數。友元函數因為沒有this指針,所以形參會多一個。

// 運算符重載,這裡又叫賦值函數
string& operator =(const string &other);
// 運算符重載,但這裡要用友元函數才行
friend ostream& operator << (ostream &os,const string &str);

string &string::operator=(const string &other)
{
    if(this == &other)
        return *this;
    delete []m_data;
    m_data = NULL;
    m_data = new char[strlen(other.m_data)+1];
    strcpy(m_data,other.m_data);
    return *this;
}

ostream& operator << (ostream &os,const string& str)    //  返回引用用於實現鏈式表達式
{
    os<<str.m_data;
    return os;
}    

 

成員函數重載與友元函數重載的區別:

If you define your operator overloaded function as member function, then compiler translates expressions like s1 + s2 into s1.operator+(s2). That means, the operator overloaded member function gets invoked on the first operand. That is how member functions work!

But what if the first operand is not a class? There's a major problem if we want to overload an operator where the first operand is not a class type, rather say double. So you cannot write like this 10.0 + s2. However, you can write operator overloaded member function for expressions like s1 + 10.0.

To solve this ordering problem, we define operator overloaded function as friend IF it needs to access private members. Make it friend ONLY when it needs to access private members. Otherwise simply make it non-friend non-member function to improve encapsulation!

兩種重載方式的比較:

  • 一般情況下,單目運算符最好重載為類的成員函數;雙目運算符則最好重載為類的友元函數。
  • 以下一些雙目運算符不能重載為類的友元函數:=、()、[]、->。
  • 類型轉換函數只能定義為一個類的成員函數而不能定義為類的友元函數。 C++提供4個類型轉換函數:reinterpret_cast(在編譯期間實現轉換)、const_cast(在編譯期間實現轉換)、stactic_cast(在編譯期間實現轉換)、dynamic_cast(在運行期間實現轉換,並可以返回轉換成功與否的標志)。
  • 若一個運算符的操作需要修改對象的狀態,選擇重載為成員函數較好。
  • 若運算符所需的操作數(尤其是第一個操作數)希望有隱式類型轉換,則只能選用友元函數。
  • 當運算符函數是一個成員函數時,最左邊的操作數(或者只有最左邊的操作數)必須是運算符類的一個類對象(或者是對該類對象的引用)。如果左邊的操作數必須是一個不同類的對象,或者是一個內部 類型的對象,該運算符函數必須作為一個友元函數來實現。(比如流操作符,即<<,>>)
  • 當需要重載運算符具有可交換性時,選擇重載為友元函數。

注意事項:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved