C++(运算符重载)

在C++里面所有的运算符号,如+、-、*、/、<<等等都是可以通过函数赋予其不同的功能的,而这种函数赋予的功能可以通过运算符号直接使用,这就是运算符重载

+运算符重载

class Car
{
	public:
		int a;
		int b;
	//成员函数进行运算符重载
		Car operator+(const &c)
		{
			Car temp;
			temp.a =this->a + c.a;
			temp.b =this->b + c.b;
			return temp;
		}
};

	Car c1;
	c1.a=1;
	c1.b=2;
	
	Car c2;
	c2.a=1;
	c2.b=2;
	//c3属性等于c1和c2对象属性相加
	Car c3=c1+c2;

当然,全局函数的运算符重载也很好用

//注意加法可以没有先后顺序,但是像右移运算符这些不可以没有顺序,c1在前,c2在后
Car operator+(const &c1,const &c2)
		{
			Car temp;
			temp.a =c1.a + c2.a;
			temp.b =c1.b + c2.b;
			return temp;
		}

左移运算符重载<<

//左移运算符重载————全局函数的重载
//调用时应该是cout<<c;但是顺序不能反过来,不可以c<<cout,这是不对的
ostream & operator<<(ostream &out,Car &c)//引用只是别名,随便写,重点是使用运算符的时候是把ostream类型的cout这个输出用的对象传进来
{
	out<<"a=\t"<<c.a<<"b=\t"<<c.b<<endl;
	return out;
}

//左移运算符重载————成员函数的重载
//这种方法不合适,因为这种方法调用运算符时代码是这样:c1<<cout;输出用的cout竟然跑到后面去了,那肯定不行,
//所以用全局函数的时候可以改变顺序
ostream & operator<<(ostream &out)
{
	out<<"a=\t"<<c.a<<"b=\t"<<c.b<<endl;
	return out;
}

递增运算符重载++

++符号有前置和后置

class Integer
{
	public:
		Integer(){num=0;}
		//类似++i的实现,先加1,再返回当前对象可以用链式操作如
		//Integer i;++(++i);
		Integer& operator++()
		{
			num++;
			return *this;
		}
		//类似与i++的实现,由于两个函数本来都没有形参,无法形成函数重载的条件
		//所以使用占位运算符int来区别不同的函数,有int代表的是后置运算符,但是这种后置的返回不是当前对象,所以无法链式操作,如(i++)++是不行的
		Integer operator(int)
		{
			Integer temp=*this;
			num++;
			return temp;
		}
	private:
		int num;
};

赋值运算符重载

class Car
{
	public:
		Car(int num)
		{
			num = new int(num);
		}
		Car& operator=(Car &c)
		{
			if(num != NULL)
			{
				delete num;
				num = NULL;
			}
			//深拷贝,重新为本对象开辟堆内存
			num = new int(*c.num);
			//返回本对象
			return *this;
		}
		int* num;
};

关系运算符重载

关系运算符有==、!=、<、>、>=、<=等等

class Car
{
	public:
		int num;
		string name;
};
bool operator==(Car& c)
{
	if(this->num==c.num && this.name==c.name)
	{
		return true;
	}
	return false;
}

函数调用运算符重载

函数调用运算符就是(),运算符重载后调用方法和函数相似,称为仿函数

class Car
{
	public:
		int num;
		int operator()(int num1,int num2)
		{
			return num1+num2;
		}
};

Car c;
cout<<c(1,2);//输出结果为3
//仿函数和真正的函数不同的是,仿函数是通过类来调用的,小括号前面是类对象名称,而函数的小括号前面是函数名称
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值