<< 左移运算符,与cout配合使用是流插入运算符,>>右移运算符,与cin配合使用是流提取运算符。
运算符重载
运算符重载的规则
- 不能重载的运算符有 : .(成员访问运算符) *(指针) ::(域运算符) sizeof(长度运算符) ?:(条件运算符)
- 如果将运算符重载作为成员函数,他可以通过this->指针*访问本类的数据成员,因此可以少写一个函数的参数。
- c++规定,赋值运算符=,下标运算符[],函数调用运算符(),成员运算符->必须作为成员函数。
- 流插入,流提取运算符,类型转化运算符不能定义为类的成员函数,只能作为友元函数。
- 运算符重载的参数个数与 运算符本身有关,单目运算符一个参数,双目运算符两个参数,如果运算符作为成员函数,则会少一个参数。
- 一般来说,形式参数的位置就是实际参数的位置。参数类型相同,实际参数位置可以调换。
一、“ + ”重载
格式: 函数类型 operator运算符名称 (形参表)
{ 运算符的重载操作
返回值
}
operator+ 做成员函数时:
声明: 函数类型 operator+(函数类型 &对象) // 可以是对象,可以是引用
定义: 函数类型 类名::operator+(函数类型 &(对象) a)
{ 函数类型 c;
c.real = real + a.real;
c.imag = imag + a.imag;
return c;
}
函数调用: c3 = c1 + c2;等价于 c1.operator(c2);
operator+做友元函数时:
声明: 函数类型 operator+(类名 a, 类名 b)
定义: 函数类型 operator+(类名 a, 类名 b)
{ 类名 c;
c.real = a.real + b.real;
c.imag = a.imag + b.imag;
return c;
// return 类名(a.real + b.real, a.imag + b.imag);
}
函数调用: c = a + b ;
(a+b).display();
注意事项:
return 类名(a.real + b.real, a.imag + b.imag)是建立一个临时对象,他没有对象名,是一个无名对象。 在建立对象过程中调用构造函数。
二、“++” 自增运算符
- 单目运算符,能作为成员函数。(推荐)
- ++分为前置递增和后置递增。
- 前置递增 声明: 类型 & opreator++(); 可以是引用,可以是值。
- 后置递增 声明: 类型 opreator++(int) ;不能返回引用,int是占位参数。
- 前置递增返回一个 *this,返回自加后的当前对象。
- 后置递增需要创建一个 临时对象(*this),指向当前对象,接收当前类的对象值,后置递增,返回临时对象,即自增前的对象值。
声明:Time operator++(); //前置递增
定义: Time Time::operator++()
{ ....
return *this;
}
声明: Time operator++(int); // 后置递增
定义: Time Time::opreator++(int)
{ Time t(*this);
......
return t;
}
三、流运算符重载
- I/O 输入输出
- cout是ostream类的一个对象 ostream cout;
- cin是istream类的一个对象 istream cin;
- 流运算符重载只能作为友元函数,如果作为成员函数,会出现date<<cout的情况,而且不能链式输出。
- <<与>>重载只能返回引用,参数为引用。且第一个参数必须是输入输出流的对象引用,第二个是类对象的引用。
运算符重载使用 引用的重要性:
利用引用做函数的形参可以在调用函数的过程中不是用传递值的方式进行虚实结合,而是通过传地址的方式使形参成为实参的别名,因此不生成临时变量(实参的副本),节省了时间和空间的开销。
如果重载函数的返回值是对象的引用时,返回的不是常量,而是引用所代表的对象,它可以出现在赋值号的左边而成为左值,可以被赋值或者参与其他操作。
ostream & operator<<(ostream& out, A &a)
{
out<<a.x<<" "<<a.y<<endl;
return out;
}