运算符重载与友元函数

1、概述函数

  C++预约义的运算符的操做对象只能是基本数据类型,可是实际上许多用户自定义类型(例如类),也须要相似的运算符操做,C++能够经过运算符重载来知足这种需求。运算符重载本质就是函数重载,也是C++多态的一种形式。运算符重载是经过建立运算符函数实现的,和其余函数相似,惟一的区别是函数名为关键字operator和运算符符号组成。this

2、运算符重载限制指针

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

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

(3)不能建立新的运算符数据类型

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

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

3、友元函数co

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

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

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

(1)函数定义

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

  {

  }

(2)函数调用

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

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

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

(1)函数定义

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

  {

  }

(2)函数调用

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

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

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

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

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

三、当须要重载的运算符具备可交换性时,选择友元函数

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

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

六、 若运算符所需的操做数(尤为是第一个操做数)但愿有隐式类型转换,则只能选用友元函数

相关文章
相关标签/搜索