c++基础--operator+定义在类内还是在类外

操作符重定义

若不用this,操作符应该定义在类外

#pragma once
#ifndef _COMPLEX_
#define _COMPLEX_

class complex;
complex&
_doapl(complex* ths, const complex& r);

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

double real() const { return re; };
double img() const { return im; };

    //出现问题,vs提示此运算符函数的参数太多
complex
operator +(const complex,const complex&);
//与之相比,+=没有出现问题
complex&
operator +=(const complex&);
private:
double re, im;
};

complex
complex::operator +(const complex&);
#endif

在上述代码中,定义在类内的operator报错

complex
operator +(const complex,const complex&);

operator+是一个双目运算符,它的入参应该是两个。定义在类内的时候,每一个函数会自动天界一个默认入参this。而很明显 我们计算复数的时候 y = x + z。这种情况是不需要this的。所以在这种不需要this的情况下,我们需要将operator+ 定义为全局函数。

与之相比,+=也为双目运算符,为什么它就能定义在类内了呢?

因为 y+=z。此时是需要y的值的,也就是说,在真正计算的时候,是需要this的值的,所以应该定义在类内。

编译器会自动检查,若双目运算符定义在类内,则最多只能有一个入参,因为this也算一个。
我们应该这样定义:

#pragma once
#ifndef _COMPLEX_
#define _COMPLEX_

class complex;
complex&
_doapl(complex* ths, const complex& r);

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

double real() const { return re; };
double img() const { return im; };

//与之相比,+=没有出现问题
complex&
operator +=(const complex&);

private:
double re, im;
};

//定义为全局函数
complex
operator +(const complex&){

};
#endif
(0)

相关推荐