2017-02-15 58 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删除了。 –