重载运算符规则
可以重载的运算符:+ - * / % & | ~ ![] () new delate
不能重载的运算符:
. .* :: ?: sizeof
重载运算符函数可以对运算符作出新的解释,即定义用户所需要的各种操作。但运算符重载后,原有的基本语义不变,包括:
1.不改变运算符的优先级;
2.不改变运算符的结合性;
3.不改变运算符所需要的操作数。
语法形式:
类型 类名::operator op(参数表)
{
//相对于该类定义的操作
}
其中,“类型”是函数的返回值。“类名”是要重载该运算符的类。“op”表示要重载的运算符。函数名是“operator op”,由关键字operator和重载的运算符op组成。“参数表”列出该运算符所需要的操作数。
用成员函数重载运算符
成员运算符函数的原型在类的内部声明格式如下:
class X
{
//..
返回类型operator运算符(形参表);
//..
}
在类外定义成员运算符函数的格式如下:
返回类型 X:operator运算符(形参表)
{
函数体
}
用友元函数重载运算符
1.在第一个参数需要隐式转换的情形下,使用友元函数重载
2.友元函数没有this指针,所需操作数都必须在参数表显示
3.c++中不能用友元函数重载的运算符有: = () [] ->
例:复数运算
#include<iostream>
using namespace std;
class Complex
{
public:
Complex(double r=0,double i=0){Real=r;Image=i;}
Complex(int a){Real=a;Image=0;}
void print()const;
friend Complex operator+(const Complex & c1,const Complex & c2);
friend Complex operator-(const Complex & c1,const Complex & c2);
friend Complex operator-(const Complex & c);
private:
double Real,Image;
};
Complex operator +(const Complex & c1,const Complex & c2)
{
double r=c1.Real+c2.Real;
double i=c1.Image+c2.Image;
return Complex(r,i);
}
Complex operator-(const Complex &c1,const Complex & c2)
{
double r=c1.Real-c2.Real;
double i=c1.Image-c2.Image;
return Complex(r,i);
}
Complex operator-(const Complex & c)
{
return Complex(-c.Real,-c.image);
}
void Complex::print()const
{
cout<<"("<<real<<","<<Image<<")"<<endl;
}
重载赋值运算符
1.赋值运算符重载用于对象数据的复制
2.operator=必须重载为成员函数
3.重载函数的原型为:
类名 & 类名::operator=(类名);
4.运算符[]和()是二元运算符
5.[]和()只能用成员函数重载,不能用友元函数重载
重载流插入和流提取运算符:
1.istream和ostream是C++的预定义流类
2.cin是istream的对象,cout是ostream的对象
3.运算符<<由ostream重载为插入操作,用于输出基本类型数据
4.运算符>>由istream重载为提取操作,用于输入基本类型数据
5.用友元函数重载<<和>>,输入和输出用户自定义的数据类型
重载输出运算符“<<"(只能被重载为友元函数,不能重载为成员函数)
定义输出运算符”<<"重载函数的一般格式如下:
ostream& operator<<(ostream& out,class name &obj)
{
out<<obj.item1;
out<<obj.item2;
......
out<<obj.itemn;
return out;
}
重载输入函数“>>”(只能被重载为友元函数)
定义输入运算符函数“>>”重载函数的一般格式如下:
istream& operate>>(istream& in,const name &obj)
{
in>>obj.item1;
in>>obj.item2;
.....
in>>obj.itemn;
return in;
}
学习感想:通过对重载函数的学习,我感觉对函数调用有了跟深一步的了解,使函数使用更加方便,提高了编程的效率。