1. 程式人生 > >C++ 運算子過載與友元函式的簡單運用例項

C++ 運算子過載與友元函式的簡單運用例項

前言:C++的運算子過載與友元函式是像類似Java這種純的面向物件程式語言所不具備的特徵,那麼使用運算子過載與友元函式到底能帶來什麼樣的不同呢?

舉個例子,假如需要實現一個複數的加減法,用Java實現後兩個複數相加的程式碼可能如下:

public static void main(String[] args) {
    ComplexNumber a = new ComplexNumber(10.0, 8.0);
    ComplexNumber b = new ComplexNumber(6.0, 5.0);

    ComplexNumber c = a.add(b);
    ComplexNumber d = a.sub(b);
}

注意到兩個複數類相加只能呼叫複數類中的方法,並不能直接使用 a + b這種形式,但是C++中卻提供了運算子過載來解決這個問題,同樣實現複數的加減法其程式碼如下:

#include <iostream>
#include <string>

using namespace std;

using std::string;

class  ComplexNumber
{
public:
    double real;        // 實數
    double imaginary;   // 虛數

public:
    ComplexNumber(double real = 0.0
, double imaginary = 0.0); ComplexNumber operator+(const ComplexNumber &b); ComplexNumber operator-(const ComplexNumber &b); friend ostream & operator<<(ostream &os, const ComplexNumber &cn); }; ComplexNumber::ComplexNumber(double real, double imaginary) { this
->real = real; this->imaginary = imaginary; } ComplexNumber ComplexNumber::operator+(const ComplexNumber &b) { ComplexNumber cn; cn.real = this->real + b.real; cn.imaginary = this->imaginary + b.imaginary; return cn; } ComplexNumber ComplexNumber::operator-(const ComplexNumber &b) { ComplexNumber cn; cn.real = this->real - b.real; cn.imaginary = this->imaginary - b.imaginary; return cn; } ostream & operator<<(ostream &os, const ComplexNumber &cn) { os << "(" << cn.real << " + " << cn.imaginary << "i)"; return os; } int main() { ComplexNumber a(10.0, 8.0); ComplexNumber b(6.0, 5.0); ComplexNumber c = a + b; ComplexNumber d = a - b; cout << a << " + " << b << " = " << c << endl; cout << a << " - " << b << " = " << d << endl; return 0; }

其執行結果如下:

(10 + 8i) + (6 + 5i) = (16 + 13i)
(10 + 8i) - (6 + 5i) = (4 + 3i)

哈哈哈,這樣呼叫的感覺是不是棒呆了,完全符合加減法的書寫習慣。而在C++中只要使用operator關鍵字,便可實現運算子的過載,運算子過載遵循如下規則:

  1. C++中的運算子除了少數幾個之外,全部可以過載,而且只能過載C++中已有的運算子;
  2. 過載之後運算子的優先順序和結合性都不會改變;
  3. 運算子過載是針對新型別資料的實際需要,對原有運算子進行適當的改造。一般來說,過載的功能應當與原有功能相類似,不能改變原運算子的操作物件個數,同時至少要有一個操作物件是自定義型別。

注:操作符可以過載的運算子包括:

  • 算術運算子:+,-,*,/,%,++,–;
  • 位操作運算子:&,|,~,^,<<,>>
  • 邏輯運算子:!,&&,||;
  • 比較運算子:<,>,>=,<=,==,!=;
  • 賦值運算子:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
  • 輸入輸出運算子:<<, >>
  • 其他運算子:[],(),->,,(逗號運算子),new,delete,new[],delete[],->*。

不可過載的運算子包括:

  • 成員運算子:.
  • 指標運算子:*
  • 作用域運算子:::
  • sizeof
  • 條件運算子:?:

其中,在上面的例子中,過載輸入輸出運算子時必須使用友元函式,而友元函式則是指某些雖然不是類成員卻能夠訪問類的所有成員的函式,即如果類A中的函式要訪問類B中的成員(例如:智慧指標類的實現),那麼類A中的該函式必須要是類B的友元函式。友元函式的定義使用friend 關鍵字,其實現方式大致如上所示。

以此,僅為對C++運算子過載與友元函式的一個簡單使用總結,實際運用中應該靈活運用,以實現其最大作用。

路漫漫兮其修遠兮,任重而道遠。