c++之运算符重载

什么是运算符重载

运算符重载类似函数重载是为已有的运算符定义新的运算功能,体现了多态性。
举个例子
“+”的基本功能是实现整数相加和实数相加
通过运算符重载我们可以对他的功能进行扩充,我们之前用的string类中就是如此

string a=“123’,b=“456”,c;
则 c=a+b;
c就为"123456”
这里"+"被重载为两个字符串拼接

实现运算符重载功能的函数称为于是暖夫重载函数,格式为
返回类型 operator 运算符符号(参数说明);

运算符重载的两种形式

用成员函数实现运算符重载

举例子

//定义一个复数类
class Complex
{
private:
	double real,image;
public:
	Complex(double r=0,double i=0){real=r;image=i;}
	Complex operator+(const Complex &c){
		Complex temp;
		temp.real=real+c.real;
		temp.image=image+c.image;
		return temp;
	}
};

这样我们就可以

Complex a(1,2),b(3,4),c;
c=a+b;//隐式调用a.operator+(b)

//c的real为4,image为6

用友元函数实现运算符重载

//定义一个复数类
class Complex
{
private:
	double real,image;
public:
	Complex(double r=0,double i=0){real=r;image=i;}
	friend Complex operator+(const Complex &a,const Complex &b);
};

Complex Complex::operator+(const Complex &a,const Complex &b)
{
	Complex temp;
	temp.real=a.real+b.real;
	temp.image=a.image+b.image;
	return temp;
}

这样我们就可以

Complex a(1,2),b(3,4),c;
c=a+b;//隐式调用operator+(a,b)

//c的real为4,image为6

转换构造函数和类型转换函数

类型转换

四种类型转换

  • 不同内部基本类型转换
  • 不同用户自定义类型之间转换
  • 内部类型转换为用户自定义类型
  • 用户自定义类型转换为内部类型

内部类型的转换我们用过很多次,强制转换和自动转换,这里不说了

内部类型转为用户自定义类型要用转换构造函数
比如前面的Complex类
我可以添加一个
Complex(double c){real=c;image=0;}
实现把一个double类型转换成Complex类型

类类型转换为内部基本数据类型或者其他类类型要用类型转换成员函数

operator type()
{
···
return data;//data的类型是type,可以是内部也可以是自定义
}

这个函数可以将本类的类型转换为其他类型

例如还是那个Complex类

我定义
operator double()
{
return real;
}

这样可以把一个Complex类转换成double类

常见运算符的重载举例

这里重点举例>>和<<的运算符重载

注意由于无法更改ostream和istream类定义,所以这两个运算符重载函数只能定义成两个参数的全局函数,应且必须在用户自定义的类中声明为友元函数

friend ostream & operator<<(ostream &out, 类对象 &r);
friend istream & operator>>(istream &in, 类对象 &r);

你可能感兴趣的:(c++)