C++ 操作符重载

c++中不仅提供函数重载,还有操作符重载,操作符重载一般是用于类的操作符重载。比如string的操作其实就是定义了一个特殊的类,并且提供一系列的函数使其类似于数据类型的。

重载操作符的方法:

函数:<函数类型>(类名::)operateor<运算符>(<形参表>)

1.重载操作符函数的参数必须至少有一个是该类类型的对象。

2.操作符重载不能改变操作符的结合性和优先级。

3.  重载操作符函数不能有默认的参数。

比如以自增运算符重载举例:

#include <iostream>

using namespace std;

class A
{
public:
	int m_data;
	A& operator ++ ();
	A operator ++ (int);
	A()			//默认构造函数
	{
		m_data = 0;
	}
	A(int a)		//带参数的构造函数
	{
		m_data = a;
	}
};
	A& A:: operator ++ ()		//重载前置自增操作符
	{
		cout << "前置自增" << endl;
		m_data = m_data + 1;
		return *this;
	}
	A A:: operator ++ (int)		//重载后置自增操作符
	{
		cout << "后置自增" << endl;
		A a = *this;
		m_data = m_data + 1;
		return a;
	}

int main(void)
{
	A a(2);
	int  test = 2;
	//这段输出有点问题,输出是3 3,按道理应该像下面test输出一样2,4。通过重载函数的打印发现前置自增被先调用了
	//推测可能是跟输出运算符<<或输出流的缓冲有关,等解决了再补充
	cout << (a++).m_data << endl << (++a).m_data << endl;	
	cout << a.m_data << endl;		//输出为4
	//cout << (a++).m_data <<endl;		//如果运行的是这两行则输出2,4。和预想的一样。
	//cout << (++a).m_data <<endl;
	cout << test++ << endl << ++test <<endl;
	
	return 0;
}

1.成员函数:

要求第一个操作数必须为该类的对象(成员函数有一个隐含的this形参,限定其为第一个操作数。作为成员重载的操作符,要求访问重载函数的第一个操作数必须为该类的对象)所以上面那个前置自增实际上是有形参的;

   赋值操作符必须为成员函数(复合赋值运算符和自增自减运算符也可以看做是赋值运算符)

单目运算符最好重载为成员;

   举个例子:

class point
{
	int a;
	double b;
public:
	point()		//默认构造函数最好(一定)要有
	{
		a = 0;
		b = 0;
	}
	point& operator = (const point& in)		//成员函数
	{
		a = in.a;
		b = in.b;
		return *this;
	}
}


2.友元函数:

双目运算符重载为友元函数比重载为成员函数更为方便(但是赋值运算符还是重载为成员函数为好,如果被重载为友元函数会出现与赋值语义不一致的地方);
关系操作符重载函数必须返回bool类型;

  依然举个例子:

//类的定义同上个例子
friend point operator + (const point& in_1, const point& in_2)	//友元函数重载运算操作符
	{
		point out;
		out.a = in_1.a + in_2.a;
		out.b = in_1.b + in_2.b;
		
		return out;
	}
	friend bool operator == (const point& in_1, const point& in_2)	//友元函数重载关系操作符
	{
		if(in_1.a == in_2.a && in_1.b == in_2.b)
			return true;
		else
			return false;
	}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值