• 运算符重载与友元函数


    一、概述

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

  • 相关阅读:
    GFS读后笔记
    BigTable读后笔记
    恢复系统基础理论
    事务基础理论
    ARIES算法简介
    怎么快速构建自己的C/C++程序?——有关编译、静态链接和SCons
    lua学习笔记
    运行时动态伪造vsprintf的va_list
    11月30日站立会议
    11月29号站立会议
  • 原文地址:https://www.cnblogs.com/justkong/p/8794323.html
Copyright © 2020-2023  润新知