C++ 之 运算符重载 相关知识点整理
1.重载运算符函数可以对运算符作出新的解释,但原有基本语义不变:
Ø不改变运算符的优先级
Ø不改变运算符的结合性
Ø不改变运算符所需要的操作数
Ø不能创建新的运算符
Ø运算符函数是一种特殊的成员函数或友元函数
Ø一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符
2.语法
Ø 成员函数的语法形式为:
类型 类名 :: operator op ( 参数表 )
{
// 相对于该类定义的操作
}
3.成员函数和友元函数重载:
Ø 运算符函数可以重载为成员函数或友元函数
Ø 关键区别在于成员函数具有 this 指针,友元函数没有this指针
Ø 不管是成员函数还是友元函数重载,运算符的使用方法相同。但传递参数的方式不同,实现代码不同,应用场合也不同
Ø当一元运算符的操作数,或者二元运算符的左操作数类的对象时,定义重载算符函数为成员函数
3.1一元重载
Ø重载为成员函数,解释为:
Object . operator op ()
操作数由对象Object通过this指针隐含传递
Ø重载为友元函数,解释为:
operator op (Object)
操作数由参数表的参数Object提供
3.2 二元重载
Ø重载为成员函数,解释为:
ObjectL . operator op ( ObjectR )
左操作数由ObjectL通过this指针传递,右操作数由参数ObjectR传递
Ø重载为友元函数,解释为:
operator op ( ObjectL, ObjectR )
左右操作数都由参数传递
3.3 友元函数重载
Ø 在第一个参数需要隐式转换的情形下,使用友元函数重载运算符是正确的选择
Ø 友元函数没有 this 指针,所需操作数都必须在参数表显式声明,很容易实现类型的隐式转换
Ø C++中不能用友元函数重载的运算符有 = () [] ->
Ø 用友元函数重载像“++”这样的运算符时,有时会碰到问题。
Ø 如果一个运算符的操作要修改类的对象的状态,要重载为友元函数时,应该使用引用参数。
Ø 若一运算符的操作需要修改类对象状态时,应该用成员函数重载;需要左值操作数的运算符(如 ++,--),若重载为友元函数时要用引用参数
Ø C++不能用友元重载的运算符: = () [] ->
Ø 如果运算符的操作数(尤其是第一个操作数)希望有隐式转换,则必须用友元函数重载
解释:运算符重载的一个要求,若运算符所需的操作数(尤其第一个操作数)希望有隐式类型转换,则只能选用友元函数。例如,一个复数类Complex的+的重载(它有个构造函数为Complex(double r=0.0,double i=0.0):real(r),imag(i){})。若+重载为友元函数,5.0+c1可以直接使用,因为Complex的构造函数使得实数可以被隐式转换为Complex的类型,这样5.0+c1就会以operator+(Complex(5.0)+c1)的方式来执行,同理c1+0.5也一样。而若+重载为成员函数,则左操作数必须要求为Complex类型,不能是实数(因为调用成员函数的目的对象不会被隐式转换),只有右操作数可以是实数(右操作数是函数的参数,可以隐式转换),即c1+5.0可以,但是5.0+c1会报错。
4.类型转换
Ø数据类型转换在程序编译时或在程序运行实现
基本类型 ←→ 基本类型
基本类型 ←→ 类类型
类类型 ←→ 类类型
Ø类对象的类型转换可由两种方式说明:
构造函数 转换函数
称为用户定义的类型转换或类类型转换,有隐式调用和显式调用方式
Ø 带参数的构造函数不能把一个类类型转换成基本类型
Ø 类类型转换函数是一种特殊的成员函数,提供类对象之间显式类型转换的机制
语法形式:
X :: operator T ( )
{ ……
return T 类型的对象
}
功能:将类型 X 的对象转换为类型 T 的对象
· T 可以是预定义类型,也可以是用户定义类型
· 函数没有参数,没有返回类型,但必须有一条 return 语句,返回T 类型的对象
· 该函数只能为成员函数,不能为友元
5.总结
Ø运算符重载可以像基本数据类型一样,用简洁明确的运算符操作自定义的类对象。
Ø重载运算符函数可以对运算符作出新的解释,但原有基本语义不变。
Ø运算符函数既可以重载为成员函数,也可以重载为友元函数或普通函数。
Ø当一元运算符的操作数,或者二元运算符的左操作数是类的一个对象时,以成员函数重载;当一个运算符的操作需要修改类对象状态时,应该以成员函数重载。如果以成友元函数重载,则使用引用参数修改对象。
Ø当运算符的操作数(尤其是第一个操作数)希望有隐式转换,则重载算符时必须用友元函数。
Ø构造函数和类型转换函数可以实现基本类型与类类型,以及类类型之间的类型转换。
资料参考 《C++程序设计》 周霭如
- C++所学的相关知识点整理(不定期更新)
- C++继承相关知识点总结
- C++ 多态知识点综合整理
- MQTT相关知识点整理
- 计算机网络相关知识点整理-HTTP
- C++知识点整理
- C++new/delete相关知识点详解
- 【C++再学习】【05】有关类的一些知识点整理
- C++相关问题整理汇总
- c++的相关知识点
- Hadoop一些相关知识点整理
- C++new/delete相关知识点详解
- c++初级知识点整理(一)
- iframe高度相关知识点整理
- 简练网软考知识点整理-项目招投标相关法律
- c++ 相关的技术资源整理归类
- Bootstrap笔记和相关知识点整理
- c++ 11中emplace_back替代push_back的相关知识点,含右值引用,move用法等
- C++知识点系列之一(转+整理)
- c++知识点整理(下)