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 
posted @ 2020-12-10 17:01  lsxkugou  阅读(629)  评论(0编辑  收藏  举报