运算符的重载

将运算符重载为类的成员函数,一般形式为:

class 类名{ //类体
   ………
  返回类型 operator 运算符号(形式参数列表)
  {
      函数体
  }
  ……
};

当运算符重载为成员函数时,运算符函数的形式参数的个数比运算符规定的运算对象个数少一个。
因为是类的非静态成员函数都有一个隐含的this指针,运算符函数可以用this指针隐式的访问类对象的成员,因此这个对象自身的数据可以直接访问,不需要放到形参列表中进行传递,少了的运算对象就是该对象本身
1.双目运算符重载为类的成员函数,形式如下
返回类型 类名::operator op(const 所属类型 &obj2)
{
…… //this指针对应obj1运算对象
}
经过重载后,表达式“obj1 op obj2"
相当于 obj1.operator op(obj2)
实例代码如下:

#include <iostream>
using namespace std;

class complex //复数类
{
	public:
		complex(double r = 0.0, double i = 0.0){ real = r; imag = i; }//构造函数
		complex operator +(complex &c2); //重载+运算符
		complex operator -(complex &c2);  //重载-运算符
		void display()
		{
			cout << real << "+" << imag << "i" << endl;
		}
	private:
		double real;  //实部
		double imag;//虚部
};
complex complex::operator +(complex &c2)
{
	complex c;
	c.real = c2.real + real;
	c.imag = c2.imag + imag;
	return c;
}
complex complex::operator -(complex &c2)
{
	complex c;
	c.real = real - c2.real;   //顺序不能颠倒
	c.imag = imag - c2.imag;
	return c;
}

int main()
{
	complex c1(1, 2), c2(3, 4), c3;
	c3 = c2 + c1; c3.display(); //输出4+6i
	c3 = c2 - c1; c3.display(); //输出2+2i

	system("pause");
	return 0;
}

在这里插入图片描述
2.前置单目运算符重载为类的成员函数,形式如下:
返回类型 类名::operator op()
{
……//this指针对应obj运算对象
}
经过重载后,表达式 ”op obj"
相当于obj.operator op()

实例代码如下:

#include <iostream>
using namespace std;

class complex //复数类
{
	public:
		complex(double r = 0.0, double i = 0.0){ real = r; imag = i; }//构造函数
		complex operator ++(); //重载前置++
		void display()
		{
			cout << real << "+" << imag << "i" << endl;
		}
	private:
		double real;//实部
		double imag;//虚部
};
complex complex::operator ++()
{
	complex a;
	real++;
	imag++;
	a.real = real;
	a.imag = imag;
	return a;
}

int main()
{
	complex c1(1, 2),c2;
	c2 = ++c1;
	c1.display();//输出2+3i
	c2.display();//输出2+3i

	system("pause");
	return 0;
}

在这里插入图片描述
3.后置单目运算符重载为类的成员函数,形式如下:
返回类型 类名::operator op(int)//参数 int 用来区分前置和后置
{
   ……//this指针对应obj运算对象
}
经过重载后,表达式 “obj op”
相当于obj.operator op(0)

实例代码如下:

#include <iostream>
using namespace std;

class complex //复数类
{
	public:
		complex(double r = 0.0, double i = 0.0){ real = r; imag = i; }//构造函数
		complex operator ++(); //重载后置++
		void display()
		{
			cout << real << "+" << imag << "i" << endl;
		}
	private:
		double real;//实部
		double imag;//虚部
};
complex complex::operator ++()
{
	complex a;
	a.real = real;
	a.imag = imag;
	real++;
	imag++;
	return a;
}

int main()
{
	complex c1(1, 2),c2;
	c2 = ++c1;
	c1.display();//输出2+3i
	c2.display();//输出1+2i

	system("pause");
	return 0;
}

在这里插入图片描述

将运算符重载为友元函数,一般形式为:

class 类名{ //类体
   ………
  //友元声明
  friend 返回类型 operator 运算符号(形式参数列表);
};
返回类型 operator 运算符号(形式参数列表)
{
   函数体
}
当运算符重载为友元函数时,运算符函数的形式参数的个数和运算符规定的运算对象一致

1.双目运算符重载为类的友元函数,形式如下:
返回类型 operator op(const 所属类型 &obj1,const 所属类型 &obj2)
{
   ……//obj1和obj2分别对应两个运算对象
}
经过重载后,表达式“obj1 op obj2"
相当于operator op(obj1,obj2)

#include <iostream>
using namespace std;

class complex //复数类
{
	public:
	complex(double r = 0.0, double i = 0.0){ real = r; imag = i; }//构造函数
	friend complex operator +(const complex &c1,const complex &c2); //重载+运算符
	friend complex operator -(const complex &c1,const complex &c2); //重载-运算符
	void display()
	{
		cout << real << "+" << imag << "i" << endl;
	}
	private:
	double real;  //实部
	double imag;//虚部
};
complex operator +(const complex &c1,const complex &c2)
{
	complex c3;
	c3.real = c1.real + c2.real;
	c3.imag = c1.imag + c2.imag;
	return c3;
}
complex operator -(const complex &c1,const complex &c2)
{
	complex c3;
	c3.real = c1.real - c2.real;   //顺序不能颠倒
	c3.imag = c1.imag - c2.imag;
	return c3;
}

int main()
{
	complex c1(1, 2), c2(3, 4), c3;
	c3 = c2 + c1; c3.display(); //输出4+6i
	c3 = c2 - c1; c3.display(); //输出2+2i

	system("pause");
	return 0;
}

在这里插入图片描述
2.前置单目运算符重载为类的友元函数,形式如下:
返回类型 operator op(const 所属类型 &obj)
{
   …… //obj对应运算对象
}
经过重载后,表达式”op obj2"
相当于operator op(obj)

3.后置单目运算符重载为类的友元函数,形式如下:
返回类型 operator op(const 所属类型 &obj,int )
{
   …… //obj对应运算对象
}
经过重载后,表达式”op obj2"
相当于operator op(obj)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值