2011-09-06 97 views
4
// By using structure :  
struct complex { 
    float real; 
    float imag; 
};  

complex operator+(complex, complex);  

main() { 
    complex t1, t2, t3;  
    t3 = t1 + t2;  
}  

complex operator+(complex w, complex z) { 
    statement 1;  
    statement 2; 
}  

// By using class :  
class complex { 
    int real; 
    int imag;  

public:  
    complex operator+(complex c) { 
    statement 1;  
    statement 2;  
    }  

    main() {  
    complex t1, t2, t3;  
    t3 = t1 + t2;  
    }  

當使用結構時,重載函數可以接受兩個參數,而同時使用類重載函數接受只有一個參數,當重載操作功能是在這兩種情況下的成員函數中結構,即以及在班上。爲什麼會發生?結構與類

+1

格式化您的代碼,然後再問問題。 –

+0

您應該在每行之前放置四個空格來格式化代碼。您也可以選擇它並單擊「{}」按鈕。在[Markdown編輯幫助](http://stackoverflow.com/editing-help)頁面提供更多有用的提示。 –

+0

問題是什麼? – Seb

回答

3

...當重載運算符函數是在這兩種情況下, 即結構以及類的成員函數...

是什麼讓你這麼說?這不是真的。

在你的例子中struct的情況下,重載的運算符函數是而不是的成員。這就是爲什麼它需要2個參數。

所以,這個差別與struct和class的問題完全沒有關係。你在這些運算符中有不同數量的參數的原因是第一個實現爲非成員(因此有兩個顯式參數),而第二個實現爲成員(因此只有一個顯式參數)。

+0

+1:我意識到讀完你的答案後才被問到:) –

10

這與類與結構無關。這是關於成員與非成員。

C++中的類和結構體完全不同於其成員和基礎的默認可訪問性級別(public爲結構體,private爲類)。除此之外,根本沒有差別

重載操作符時,幾乎總是可以選擇將操作符定義爲成員還是獨立函數。只有4個運營商必須成爲會員。它們是:(),[],->=(至於爲什麼,參見this question of mine)。其餘的選擇是你的。

這個優秀的FAQ entry解釋(除其他外)如何選擇成員與非成員之間。

要回答你的核心問題:在成員函數的情況下,第一agument是*this

+0

There's一個*慣用*差異。很多程序員在C++項目中使用'struct'作爲未封裝的POD,在有OOP時使用'class'。但是,不,除了默認的可訪問性之外,沒有任何技術上的不同。 – spraff

+0

@armen我已經明確寫過重載函數在這兩種情況下都是成員函數,即在結構體和類中 –

+0

@ desprado07:有人編輯了你的問題並刪除了你原來寫的內容。現在你的問題是不同的。上述阿門的答案是正確的,但它忽略了原始問題的重點。 – AnT

0

這是因爲你用不同的方法來定義操作。當你使用struct時,你需要在struct之外定義它,但是當使用class時,你需要在類中定義運算符。

+0

這是他做了什麼的描述,但沒有說明他做錯了什麼,也沒有說明如何解決它。 –

0

當您想要將兩個參數傳遞給您的重載操作符+時,應該創建該類的朋友函數,然後將const complex& lhs, const complex& rhs作爲參數傳遞。現在你可以有兩個參數給你的operator+

operator+是類的成員時,一個arg作爲this指針隱式傳遞。

+0

朋友功能不是必需的。只是回答問題。 –

+1

@ desprado07,我想你應該閱讀阿爾門在答案中提供的常見問題。 –

-2

在第二個例子中,過載操作是類的成員函數,因此當這個操作符被調用時,它被稱爲第一操作數的一個成員函數和所述第一操作數因此隱含地作爲對象給定在其上成員函數已被調用(如果你喜歡,指針爲this)。

+0

雖然是正確的,但這是一個運行的句子,我不得不多次閱讀,看它是否正確。 –

+0

@Mooing你發現結果是錯的?或者它只是一個語法相關的downvote?雖然主要條款的積累可能被視爲不良風格,但其內容的演繹過程是完全線性的。如果你不是downvoter,那麼請原諒我責怪你。 –

+0

正如我所說的,結果是正確的。我的投訴僅僅是語法相關的。 –

-1
// 
complex operator +(cont complex& lhs, const complex& rhs) 
{ 
    ... 
} 

main() 
{ 
    complex t1,t2,t3;  
    t3=t1+t2; // i.e. t3 = operator+(t1, t2); 
} 

// 
class complex 
{ 
    int real,imag;  
public:  
    complex operator +(const complex& rhs){} 
}; 

main()  
{  
    complex t1,t2,t3;  
    t3=t1+t2; // i.e. t3 = t1.operator+(t2); 
}