2017-02-15 115 views
-2

這是在cplusplus.com上找到的示例代碼,用於重載操作符。我不確定「CVector(){};」意味着這裏。它看起來不像一個構造函數,當我刪除這一行時,編譯器給我錯誤。類名後加空括號和空花括號

// overloading operators example 
#include <iostream> 
using namespace std; 

class CVector { 
    public: 
    int x,y; 
    CVector() {};        <-- This Line 
    CVector (int a,int b) : x(a), y(b) {} 
    CVector operator + (const CVector&); 
}; 

CVector CVector::operator+ (const CVector& param) { 
    CVector temp; 
    temp.x = x + param.x; 
    temp.y = y + param.y; 
    return temp; 
} 

int main() { 
    CVector foo (3,1); 
    CVector bar (1,2); 
    CVector result; 
    result = foo + bar; 
    cout << result.x << ',' << result.y << '\n'; 
    return 0; 
} 
+4

這是一個默認的構造函數。你不需要分號。另外,您的運營商+理想情況下不應該是會員功能。和cplusplus.com不是一個很好的學習資源。 –

+1

必須有一個副本,但我找不到一個... – SergeyA

+0

最好用初始化列表填寫'x'和'y' –

回答

0

我不知道什麼CVector() {};在這裏的意思。它不看起來像一個構造函數,

是什麼給你這個想法?當然,這是一個默認構造函數,定義爲,沒有任何特殊的成員初始值設定項。

可以刪除分號,它只是用於普通函數聲明,不提供定義。

當我刪除這一行時,編譯器給我錯誤。

這可能是因爲您的代碼的其他部分需要有CVector的默認構造函數。最明顯的候選人是

CVector result; 

要延長一點點:

您必須聲明/顯式定義默認構造函數,一旦你聲明類似

CVector (int a,int b) : x(a), y(b) {} 
自定義構造函數

自動生成的默認構造函數

CVector(); 
在這種情況下將不會生成

在這種情況下,最簡單的方法是寫

CVector() = default; 

但你必須定義它是使用with語句像

CVector result; 
+0

是什麼讓你認爲賦值操作符和拷貝構造函數不會被生成? –

+0

@NeilButterworth刪除了。 –