函数参数前是否加&的问题

求两个线段交点的函数中,一开始参数用的是Point2f p

int ab_cross_cd(Point2f a, Point2f b, Point2f c, Point2f d,Point2f p) //求ab是否与cd相交,交点为p。1规范相交,0交点是一线段的端点,-1不相交。
{
	double s1, s2, s3, s4;
	int d1, d2, d3, d4;
	//Point2f p;
	d1 = dblcmp(s1 = ab_cross_ac(a, b, c), 0);
	d2 = dblcmp(s2 = ab_cross_ac(a, b, d), 0);
	d3 = dblcmp(s3 = ab_cross_ac(c, d, a), 0);
	d4 = dblcmp(s4 = ab_cross_ac(c, d, b), 0);

	//如果规范相交则求交点
	if ((d1^d2) == -2 && (d3^d4) == -2)
	{
		p.x = (c.x*s2 - d.x*s1) / (s2 - s1);
		p.y = (c.y*s2 - d.y*s1) / (s2 - s1);
		return 1;
	}

	//如果不规范相交
	if (d1 == 0 && point_on_line(c, a, b) <= 0)
	{
		p = c;
		return 0;
	}
	if (d2 == 0 && point_on_line(d, a, b) <= 0)
	{
		p = d;
		return 0;
	}
	if (d3 == 0 && point_on_line(a, c, d) <= 0)
	{
		p = a;
		return 0;
	}
	if (d4 == 0 && point_on_line(b, c, d) <= 0)
	{
		p = b;
		return 0;
	}
	//如果不相交
	return -1;
}

在主函数中,先定义了一个Point2f p,然后想传入ab_cross_cd()函数中,结果没有修改p的值。
但是将上面的函数修改为
int ab_cross_cd(Point2f a, Point2f b, Point2f c, Point2f d,Point2f &p)后,就修改了p的值。
原因是:
如果使用&,表示用的是p的引用,不会调用拷贝构造函数(效率也高),即在函数ab_cross_cd()中对p的任何修改都会保存下来,p会被修改;
如果没有使用&,就会调用拷贝构造函数,在函数ab_cross_cd()中修改的是p的拷贝,没有修改p;
很多时候,如果想要提高效率(不调用拷贝构造函数),还不想改变参数,可以使用const &的组合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值