2013-12-15 43 views
0

我想了解C++操作符重載和我碰到了這段代碼:成員與非成員運算符重載

class Imaginary { 
    double re,im ; 
    public: 
    Imaginary (double r, double i=0) : re(r), im(i) {} 

    Imaginary operator - (void) const;    // member 
    Imaginary operator + (const Imaginary& x) const; // member 

    friend Imaginary operator + (double a, const Imaginary& b); // non-member ? 
}; 

這應該表明使用non-member超載。但我不明白它是如何在類中聲明的非成員?或者它取決於參數的數量,因爲+是二元運算,所以有兩個參數它被認爲是非成員和1個成員?

回答

1

A friend聲明被注入到它出現的類定義周圍的名稱空間中。也就是說,申報(命名空間添加到後來澄清):

namespace foo { 
    class Imaginary { 
     // ... 
     friend Imaginary operator+ (double a, Imaginary const& b); 
    }; 
} 

實際上做了兩件事情:它聲明的函數,並指出此功能被允許訪問類Imaginary的所有成員。聲明的功能是

foo::Imaginary foo::operator+ (double a, foo::Imaginary const& b); 
+0

哦,現在一切都清楚了,我只是不知道如何'friend'實際工作。謝謝! –

1

此行聲明op+作爲非會員朋友。這意味着儘管它是非會員,它可以看到Imaginary的私人會員。

friend Imaginary operator + (double a, const Imaginary& b); 

該操作符的實現將在該類之外。

0

Imaginary operator + (const Imaginary& x) const; // member 

friend Imaginary operator + (double a, const Imaginary& b); // non-member ? 

這兩個運營商之間有很大的區別。在第一類成員運算符左操作數的類型是虛的始終。第二個操作數的類型可以是雙的,因爲有轉換構造

Imaginary (double r, double i=0) : re(r), im(i) {} 

,允許雙精度值隱式轉換到類型假想的對象。

friend運算符允許指定一個雙精度數作爲操作的第一個操作數。再次,如果一個雙數將被指定爲第一個操作數,則將調用轉換構造函數,實際上您將得到表達式

虛數+虛數。

這樣的朋友操作追加類成員運營商允許下列表達式

Imaginary + Imaginary // class member operator will be called 
Imaginary + double// class member operator will be called 
double + Imaginary // the friend operator will be called 
+0

謝謝你的回答,雖然這不完全是我的問題。我只是不明白爲什麼一些非成員方法是在類範圍之外聲明的,其他的(在這種情況下是friend方法)在裏面。所以問題是朋友關鍵詞而不是重載。但是再次感謝你這樣徹底的回答! –

+0

事實上,在這種特殊情況下,使用兩個類型爲const Imaginary&的操作數來聲明一個朋友操作符就足夠了。 –