您的位置:首页 > 编程语言 > C语言/C++

C++ 之 运算符重载 相关知识点整理

2019-03-11 22:03 96 查看

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++程序设计》 周霭如

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: