2016-04-15 71 views
-1

假設我們要實現一個複數類:使用對象指針指向重載賦值操作符可以嗎?

#include <iostream> 
using namespace std; 

class Complex{ 
public: 
    double real; 
    double imag; 

    Complex(); 
    Complex(double _r, double _i) 
     :real(_r),imag(_i){} 
    const Complex* operator = (const Complex*); 
}; 

通常重載賦值操作符,我們將傳遞一個const引用作爲參數,但我們爲什麼不能傳遞一個指針代替,這樣的嗎?

const Complex* Complex::operator = (const Complex* cp){ 
    real = cp->real; 
    imag = cp->imag; 
    return this; 
} 

int main(){ 

    Complex c1(1,2), c2(3,4), c3(5,6); 
    Complex *pc = &c3; 

    c1 = c2 = pc; 
    cout<<"c1 = "<<c1.real<<"+"<<c1.imag<<'i'<<endl; 
    cout<<"c2 = "<<c2.real<<"+"<<c2.imag<<'i'<<endl; 
    cout<<"c3 = "<<c2.real<<"+"<<c2.imag<<'i'<<endl; 

    return 0; 
} 

上面的代碼運行,並給予正如我預期的答案:所有三個複數產生5+6i

我知道這種方法是非常不正規的,但它似乎也適用。我想知道爲什麼我們的老師強烈建議我們使用參考作業?非常感謝你們!

+0

您的'複雜'類不需要任何賦值運算符,編譯器生成的它會做它應該做的。 – milleniumbug

+1

'* this'不是'Complex *'。 – juanchopanza

+0

「爲什麼我們不能」 - 我有一個更重要的問題。爲什麼**會**你?你的老師建議引用是因爲它們被添加到C++出於各種各樣的理由,包括實現複製/賦值構造函數,操作符重載等。你認爲你知道更好嗎?我對指針沒有任何反應,並經常使用它們,但是我不喜歡它們在不適當的情況下使用,比如這裏。 –

回答

1

如果您願意,您可以這樣做。但這不是一個好主意。

通常你想象的分配使用相同類型的對象:

/*typeA*/ A = /*typeA*/ B; 

一個更現實的問題是,指針是整數。你會假設代碼:

Complex c = 5; 

設置一個複雜的{5, 0},相反,它會出現段錯誤(一些編譯器會警告你內部 - >複雜*轉換很可能不打算,但遲早,一個投< >或另一個,它會發生)

相關問題