知识点总结
重载运算符函数可以对运算符做出新的解释,即定义用户所需要的各种操作。但运算符重载后,原有的基本语义不变,包括:
不改变运算符的优先级
不改变运算符的结合性
不改变运算符所需要的操作数
不能创建新的运算符
优先级和结合性主要体现在重载运算符的使用上,而操作数的个数不但体现在重载运算符的使用上,更关系到函数定义时的参数设定。
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。
当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
运算符重载的意义
对于普通的数据成员,c++已经重载了基本的运算符,但是对于一些我们自己设置的类和结构体的新类型,运算符的功能不能直接对他们进行操作,所以就需要我们对运算符惊醒重载,实际意思就是,赋予运算符新的功能让他们能够对我们自己定义的类和结构体进行操作。
重载运算符的限制
可以重载的运算符
+ - * / % ^ & | ~
! = < > += -= *= /= %
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- ->* ‘ ->
[] () new delete new[] delete[]
不能重载的算符
. :: .* ?: sizeof
重载运算符可以对运算符做出新的解释,己定义用户所需要的各种操作,但是运算符基本语义保持不变
l 不改变运算符的优先级;
l 不改变运算符的结合性
l 不改变运算符所需要的操作数
l 不能创建新的运算符
运算符重载的语法形式
成员函数重载
返回类型 operator op(运算符)(参数表)
{
//相对于该类定义的操作;
}
成员函数重载默认运算符左数据为类数据成员
友元函数重载
friend 返回类型 opeartor op(运算符)(参数表)
{
//相对于该类定义的操作
}
另,重载有赋值含义的运算符时有在opeartor 前面加& (引用)
对于赋值运算符和地址运算符系统提供默认默认重载版本
赋值运算符 = ,系统默认重载为对象数据成员的赋值
地址运算符 & ,系统默认重载为返回任何类对象的地址
2,用成员或友元函数重载运算符
(1) 一元运算符
一元运算符不论前置或后置,都要求有一个操作数:
Object op 或 op Object
当重载为成员函数时,编译器解释为:
Object.operator op()
函数operator op所需的操作数由对象Object通过this指针隐含传递,所以参数表为空
当重载为友元函数时,编译器解释为:
Operator op(Object)
函数operator op 所需的操作数由参数表的参数Object提供。
(2) 二元运算符
任何二元运算符都要求有左,右操作数:
ObjectL op ObjectR
当重载为成员函数时,编译器解释为:
ObjectL.operator op(OpjectR)
左操作数由对象ObjectL通过this指针传递,右操作数由参数ObjectR传递。
重载为友元函数时,编译器解释为:
operator op(ObjectL,ObjectR)
左右操作数都由参数传递。
不管是成员函数还是友元函数重载,运算符的使用方法都相同。但由于它们传递参数的方法不同,因此导致实现的代码不同,应用场合也不同。
6, 重载流插入和流提取运算符
istream 和 ostream 是C++预定义流类
cin和istream 的对象,cout是ostream的对象
Ø 运算符 << 由ostream 重载为插入操作,用于输出基本类型数据
Ø 运算符 >> 由 istream 重载为提取操作,用于输入基本类型数据
Ø 用友元函数重载 << 和 >> ,输出和输入用户自定义的数据类型
重载输出运算符“<<”(只能被重载成友元函数,不能重载成成员函数)定义输出运算符“<<”重载函数的一般格式如下:
[cpp] view plain copy print?
ostream& operator<<(ostream& out,class_name& obj)
{
out<
out<
.. .
out<
return out;
}
ostream& operator<<(ostream& out,class_name& obj)
{
out<
out<
.. .
out<
return out;
}
重载输入运算符“>>” (只能被重载成友元函数)
定义输入运算符函数“>>”重载函数的一般格式如下:
[cpp] view plain copy print?
istream& operator>>(istream& in,class_name& obj)
{
in>>obj.item1;
in>>obj.item2;
. . .
in>>obj.itemn;
return in;
istream& operator>>(istream& in,class_name& obj)
{
in>>obj.item1;
in>>obj.item2;
. . .
in>>obj.itemn;
return in;
}
典型例题
#include
using namespace std;
class Coordinate
{
public:
Coordinate(int x, int y)
{
m_iX = x;
m_iY = y;
}
Coordinate &operator--()
{
this->m_iX--;
this->m_iY--;
return *this;
}
Coordinate operator--(int)
{
Coordinate coor(*this);
coor.m_iX=this->m_iX--;
coor.m_iY=this->m_iY--;
return coor;
}
Coordinate operator+(Coordinate &c)
{
Coordinate temp(0,0);
temp.m_iX=this->m_iX+c.m_iX;
temp.m_iY=this->m_iY+c.m_iY;
return temp;
}
public:
int m_iX;
int m_iY;
};
int main(void)
{
Coordinate coor1(1, 3);
Coordinate coor2(2, 4);
Coordinate coor3(0, 0);
coor1--;
--coor2;
coor3 = coor1 + coor2;
cout << coor3.m_iX << endl;
cout << coor3.m_iY << endl;
return 0;
}
心得体会
重载运算比较简洁,只是不是能很好的理解。有些地方不能熟悉的使用,之后的学习还是注重下重载的学习。