6.10.2 operator函数的重载

在上一篇文章中,我们介绍了operator函数的功能,可以实现:

c=a.operator+(b);//即c=a+b;

但是如果我们想实现:

c=a+100;

就会出错,因为我们定义的是两个对象相应的数据相加,而100是一个常量,这时该如何解决这个问题呢?

【EG】编写一个用于进行分数加法计算的类

#include<iostream>
using namespace std;
class fenshu
{
private:
	long fenzi;
	long fenmu;
	long gys(long a,long b);//求最大公约数 
public:
	fenshu()
	{
		fenzi=0;fenmu=1;
	}
	fenshu(long a,long b);
	void disp();
	fenshu operator+(fenshu &dt);
	fenshu operator+(long dt);
};
void fenshu::disp()
{
	cout<<fenzi<<"/"<<fenmu<<endl;
}
fenshu::fenshu(long a,long b)
{
	long x;
	x=gys(a,b);
	fenzi=a/x;
	fenmu=b/x;
}
fenshu fenshu::operator+(fenshu &dt)
{
	long xinfenzi,xinfenmu;
	xinfenmu=fenmu*dt.fenmu;
	xinfenzi=fenzi*dt.fenmu+dt.fenzi*fenmu;
	return fenshu(xinfenzi,xinfenmu);
}
fenshu fenshu::operator+(long dt)
{
	return fenshu(dt*fenmu+fenzi,fenmu);
}
long fenshu::gys(long a,long b)
{
	long x;
	while(b!=0)
	{
		a=a%b;
		x=a;a=b;b=x;
	}
	return a;
}
int main()
{
	fenshu a(2,16),b(1,6),c(5,1),d;
	cout<<"初始值:"<<endl;
	a.disp();
	b.disp();
	c.disp();
	d.disp();
	cout<<"a+b的结果:"<<endl;
	c=a+b;
	c.disp();
	cout<<"a+2的结果:"<<endl;
	c=a+2;
	c.disp();
}

在这里插入图片描述
在上面的程序中,求最大公约数的函数只在类的成员函数中使用,因此,把它的访问权限设置成private。
上述例子中尽管实现了运算符的重载,但是要实现下面语句的话,还是会出错:

c=2+a;
c=2.operator+(a);

因为常量2不是fenshu类的对象,所以该语句不能运行。
那么想要解决这个问题,又该怎么操作呢?

需要将operator+()函数说明为fenshu类的友元。
利用operator函数进行运算时,第一个参数必须是对象,不能是常量。
但是对于友元函数来讲,由于运算所需要的所有参数都必须作为函数的参数来进行处理,因此,即使运算所需的第一个参数是数值,也可以正确的运算。

#include<iostream>
using namespace std;
class fenshu
{
private:
	long fenzi;
	long fenmu;
	long gys(long a,long b);
public:
	fenshu()
	{
		fenzi=0;fenmu=1;
	}
	fenshu(long a,long b);
	void disp();
	fenshu operator+(fenshu &dt);
	fenshu operator+(long dt);
	friend fenshu operator+(long dt1,fenshu &dt2);
};
void fenshu::disp()
{
	cout<<fenzi<<"/"<<fenmu<<endl;
}
fenshu::fenshu(long a,long b)
{
	long x;
	x=gys(a,b);
	fenzi=a/x;
	fenmu=b/x;
}
fenshu fenshu::operator+(fenshu &dt)
{
	int xinfenzi,xinfenmu;
	xinfenzi=dt.fenzi*fenmu+fenzi*dt.fenmu;
	xinfenmu=dt.fenmu*fenmu;
	return fenshu(xinfenzi,xinfenmu);
}
fenshu fenshu::operator+(long dt)
{
	return fenshu(dt*fenmu+fenzi,fenmu);
}
long fenshu::gys(long a,long b)
{
	long x;
	while(b!=0)
	{
		a=a%b;
		x=a;a=b;b=x;
	}
	return a;
}
fenshu operator+(long dt1,fenshu &dt2)
{
	return fenshu(dt1*dt2.fenmu+dt2.fenzi,dt2.fenmu);
}
int main()
{
	fenshu x(1,4),y;
	y=x+2;
	y.disp();
	y=2+x;
	y.disp();
}

在这里插入图片描述
现在的程序就是即可实现y=2+x,也可以实现y=x+2。
程序中有一句话

fenshu operator+(long dt1,fenshu &dt2)

问这两个参数可以调换吗?答案是不可以的,必须跟类中定义友元函数保持一致,否则会出错。

当将operator+()函数作为类的友元来定义时,应保证至少有一个参数是类的对象,否则,若两个参数都是数值,如进行2+3这样的运算时,系统将出现编译错误。

fenshu fenshu::operator+(long dt)
{ 
	return fenshu(dt*fenmu+fenzi,fenmu);
}
不可以改写成
fenshu& fenshu::operator+(long dt)
{
	return fenshu(dt*fenmu+fenzi,fenmu);
}

因为该函数的返回值是利用构造函数创建的临时局部对象,函数调用结束时参数的存储空间被释放掉了,所以局部对象是不能返回其引用或者指针的。

用老师的话说:你连房子都没有,要门牌号有啥用啊???

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0 info it worked if it ends with ok 1 verbose cli [ 1 verbose cli 'C:\\Program Files (x86)\\nodejs\\node.exe', 1 verbose cli 'C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', 1 verbose cli 'run', 1 verbose cli 'serve' 1 verbose cli ] 2 info using npm@6.10.2 3 info using node@v12.8.1 4 verbose run-script [ 'preserve', 'serve', 'postserve' ] 5 info lifecycle fasp-gp@1.0.0~preserve: fasp-gp@1.0.0 6 info lifecycle fasp-gp@1.0.0~serve: fasp-gp@1.0.0 7 verbose lifecycle fasp-gp@1.0.0~serve: unsafe-perm in lifecycle true 8 verbose lifecycle fasp-gp@1.0.0~serve: PATH: C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npm-lifecycle\node-gyp-bin;C:\Users\apple\test\fasp-gp-dev\node_modules\.bin;C:\Program Files\Parallels\Parallels Tools\Applications;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\nodejs\;C:\Users\apple\AppData\Local\Microsoft\WindowsApps;C:\Users\apple\AppData\Roaming\npm;C:\Users\apple\AppData\Local\Programs\Microsoft VS Code\bin 9 verbose lifecycle fasp-gp@1.0.0~serve: CWD: C:\Users\apple\test\fasp-gp-dev 10 silly lifecycle fasp-gp@1.0.0~serve: Args: [ '/d /s /c', 'vue-cli-service serve' ] 11 silly lifecycle fasp-gp@1.0.0~serve: Returned: code: 134 signal: null 12 info lifecycle fasp-gp@1.0.0~serve: Failed to exec serve script 13 verbose stack Error: fasp-gp@1.0.0 serve: `vue-cli-service serve` 13 verbose stack Exit status 134 13 verbose stack at EventEmitter.<anonymous> (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npm-lifecycle\index.js:326:16) 13 verbose stack at EventEmitter.emit (events.js:203:13) 13 verbose stack at ChildProcess.<anonymous> (C:\Program Files (x86)\nodejs\node_modules\npm\node_modules\npm-lifecycle\lib\spawn.js:55:14) 13 verbose stack at ChildProcess.emit (events.js:203:13) 13 verbose stack at maybeClose (internal/child_process.js:1021:16) 13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:283:5) 14 verbose pkgid fasp-gp@1.0.0 15 verbose cwd C:\Users\apple\test\fasp-gp-dev 16 verbose Windows_NT 10.0.19045 17 verbose argv "C:\\Program Files (x86)\\nodejs\\node.exe" "C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "serve" 18 verbose node v12.8.1 19 verbose npm v6.10.2 20 error code ELIFECYCLE 21 error errno 134 22 error fasp-gp@1.0.0 serve: `vue-cli-service serve` 22 error Exit status 134 23 error Failed at the fasp-gp@1.0.0 serve script. 23 error This is probably not a problem with npm. There is likely additional logging output above. 24 verbose exit [ 134, true ]
07-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值