运算符重载与友元函数

一、概述

  C++预定义的运算符的操作对象只能是基本数据类型,但是实际上许多用户自定义类型(例如类),也需要类似的运算符操作,C++可以通过运算符重载来满足这种需求。运算符重载本质就是函数重载,也是C++多态的一种形式。运算符重载是通过创建运算符函数实现的,和其他函数类似,唯一的区别是函数名为关键字operator和运算符符号组成。

二、运算符重载限制

(1)至少有一个操作数是自定义类型,防止为基本数据类型重载运算符

(2)不能违反运算符原来的句法规则,不能修改运算符优先级

(3)不能创建新的运算符

(4)有些运算符不能重载

(5)大多数运算符重载可以通过成员函数或者非成员函数实现,但是有些运算符只能通过成员函数重载,例如赋值运算符=、函数调用运算符()、下标运算符[]、通过指针访问类成员运算符->

三、友元函数

在类声明中,友元函数在声明前添加friend关键字,在函数定义中不用再添加friend关键字,也不用添加类的限定符,因为友元函数为非成员函数,但是友元函数可以访问类成员变量

四、运算符重载的两种方式

1、运算符重载函数为类的成员函数

(1)函数定义

  <返回值类型> operator <运算符符号>(<形参>)

  {

  }

(2)函数调用

  <对象名>.operator <运算符>(<实参>)

  或者<对象名><运算符><参数>

2、运算符重载函数为类的友元函数

(1)函数定义

  friend <返回值类型> operator <运算符符号>(<参数类别>)

  {

  }

(2)函数调用

  operator <运算符>(<参数1>,<参数2>)

  或者operator <运算符>(<参数1>,<参数2>)

 五、两种运算符重载形式比较

1、运算符重载函数为成员函数时,函数的参数要比原来的操作数少一个,因为成员函数用this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数

2、运算符重载函数对于成员函数和友元函数这两种形式只能选择一种,否则将产生二义性错误

3、当需要重载的运算符具有可交换性时,选择友元函数

4、当运算符左边的操作数是不同类的对象时,例如cout<<MyClass,则必须采用友元函数来实现。

5、赋值运算符=、函数调用运算符()、下标运算符[]、通过指针访问类成员运算符->,这些运算符只能采用成员函数进行运算符重载

6、 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数

posted @ 2018-04-11 14:48  pinhole  阅读(442)  评论(0编辑  收藏  举报