c++中operator 操作

本文通过示例介绍了C++中运算符重载的基本概念及应用,重点讲解了如何为自定义类实现加、减等运算符,并探讨了在实际使用过程中遇到的问题及其可能的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在扣opencv源码时Point2f里面的部分代码用到了operator操作,对里面的原理百思不理其解,于是就写了示例。中间有部分有问题,还不明白原因,给注释出来了,如有哪位博友知道,可以给点指点,不胜感激。
#include <iostream>
using namespace std;

class Point
{
public:
	int x, y;
	Point(){ x = 0; y = 0; }
	Point(int _x, int _y){ x = _x; y = _y; }
	Point & operator - (Point & pt) 
	{
		x = x - pt.x;
		y = y - pt.y;

		return Point(x, y);
	}

	Point & operator + (Point & pt)
	{
		x = x + pt.x;
		y = y + pt.y;

		return Point(x, y);
	}
};

class Demo {
public:
	Demo() {
		a = 1;
		b = 1;
	}

	Demo(int pa, int pb) {
		a = pa;
		b = pb;
	}

	Demo(Point &pt) : a(pt.x), b(pt.y)
	{
		/*a = pt.x;
		b = pt.y;*/
	}

	Demo&  operator + (const Demo& p) {
		Demo demo;
		demo.a = this->a + p.a;
		demo.b = this->b + p.b;
		return demo;
	}

	Demo &operator - (const Demo& p)
	{
		Demo demo;
		demo.a = this->a - p.a;
		demo.b = this->b - p.b;
		return demo;
	}

	Demo &operator *= (const double & s)
	{
		a *=  s;
		b *=  s;
		return Demo(a, b);
	}

	Demo &operator * (const double &s)
	{
		this->a = this->a * s;
		this->b = this->b * s;
		return *this;//Demo(a, b);
	}

	Demo & operator = (const Point &pt)
	{
		return Demo(pt.x, pt.y);
	}

	operator Point() const
	{
		return Demo(a, b);
	}

	void do_something() {
		std::cout << a + b << std::endl;
	}

private:
	int a;
	int b;

};


int main()
{

	Demo d1(2, 6);
	d1.do_something();
	Demo d2(10, 24);
	d2.do_something();
	Demo d3;
	d3 = d1 + d2;
	d3.do_something();
	Demo d4;
	d4 = ((d1 + d2)) * 0.5; //无法正确调用,在调用Demo(Point &pt) : a(pt.x), b(pt.y)时无法正确传值,不知原因
	d4 =  ((d1 + d2))  ;
	d4 *=  0.5;
	d4.do_something();
	Point p1(20, 10), p2(10, 20);
	Demo d5;
	d5 = Demo((p1 - p2));//无法正确输出结果,在调用Demo &operator * (const double &s)无法正确传值,不知原因
	d5 = Demo(Point(p1 - p2));
	d5.do_something();

	/*Point2f pt0, pt1, pt2;
	pt0 = Point2f(2, 0);
	pt1 = Point2f(5, 0);
	pt2 = Point2f(0, 5);
	XK_RotatedRect rect;

	rect = XK_RotatedRect(pt0, pt1, pt2);
	*/
	return 1;
}

参考:http://pydoing.blogspot.com/2013/02/cpp-overload-operator.html



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值