• 运算符重载 C++快速入门25


    运算符重载

     

    让编程改变世界

    Change the world by program


     

    运算符重载

      所谓重载,就是重新赋予新的含义。函数重载是对一个已有的函数赋予新的含义,使之实现新功能。 其实运算符也可以重载,实际上,我们常常在不知不觉之中使用了运算符重载。   运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。 也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。  

    重载运算符的函数一般格式如下:

    函数类型 operator 运算符名称(形参表列) {

    对运算符的重载处理

    }  

    例如我们可以重载运算符 + , 如下:

    int operator+(int a, int b) {

    return (a – b);

    }   举个栗子:实现复数加法 (3, 4i)+ (5, -10i)= (8, -6i)   当我们还不知道重载,我们会这样做:complex.cpp(课件及源代码下载)   当我们朦胧懂得了重载,我们会这样做:complex2.cpp(课件及源代码下载)   当我们进一步了解小甲鱼,我们会这样做:苍井空vs小甲鱼.avi 我们在声明 Complex 类的时候对运算符进行了重载,使得这个类在用户编程的时候可以完全不考虑函数是如何实现的,直接使用 +, -, *, / 进行负数的运算即可。   其实,我们还可以对运算符重载函数 operator+ 改写得更简练一些: Complex Complex::operator+(Complex &c2) {

    return Complex(real+c2.real, imag+c2.imag);

    }  

    一些规则

    C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。  

    除了一下五个阿哥不允许重载外,其他运算符允许重载:

    .(成员访问运算符) .*(成员指针访问运算符) ::(域运算符) sizeof(尺寸运算符) ?:(条件运算符)     重载不能改变运算符运算对象(操作数)个数。 重载不能改变运算符的优先级别。 重载不能改变运算符的结合性。 重载运算符的函数不能有默认的参数。 重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应该有一个是类对象或类对象的引用。(也就是说,参数不能全部都是 C++的标准类型,这样约定是为了防止用户修改用于标准类型结构的运算符性质)。  

    运算符重载函数作为类友元函数

      不知道刚刚有没有鱼油有这样的疑问:”+”运算符是双目运算符,为什么刚刚的例子中的重载函数只有一个参数呢? 解答:实际上,运算符重载函数有两个参数,但由于重载函数是 Complex 类中的成员函数,有一个参数是隐含着的,运算符函数是用 this 指针隐式地访问类对象的成员。

    return Complex(real+c2.real, imag+c2.imag);

    return Complex(this->real+c2.real, this->imag+c2.imag);

    return Complex(c1.real+c2.real, c1.imag+c2.imag);

     

    那么例子中的 c1 + c2,编译系统把它解释为:c1.operator+(c2)

      即通过对象 c1 调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。 运算符重载函数除了可以作为类的成员函数外,还可以是非成员函数:放在类外,做 Complex 类的友元函数存在:complex3.cpp(课件及源代码下载)  

    为什么把运算符函数作为友元函数呢?

      因为运算符函数要访问 Complex 类对象的成员,如果运算符函数不是 Complex 类的友元函数,而是一个普通的函数,它是没有权力访问 Complex 类的私有成员的。 由于友元的使用会破坏类的封装,因此从原则上说,要尽量将运算符函数作为成员函数。  

    课后作业

      请听题:重载运算符 ”+”, ”-”, ”*”, ”/” 实现有理数的加减乘除运算。 如 1/8 + 7/8 = 1 如 1/8 – 7/8 = -6/8 如 1/8 * 7/8 = 7/64 如 1/8 / 7/8 = 1/7   下课:小甲鱼vs吉泽明步.rmvb [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://urlxf.qq.com/?rauYNvq']视频下载[/Downlink] [Downlink href='http://kuai.xunlei.com/d/LIELLRWNAUXJ']备胎下载[/Downlink]
  • 相关阅读:
    PHP数组内容不重复组合排列算法
    【转】五种常见的 PHP 设计模式
    【转】PHP ob_start() 函数介绍
    【转】apache/php 开启 gzip压缩
    【转】HTTP 头部解释,HTTP 头部详细分析,最全HTTP头部信息
    【转】MySQL数据库MyISAM和InnoDB存储引擎的比较
    【转】PHP 位运算应用口诀
    require,include,require_once,include_once的区别
    Linux下Redis安装使用,主从模式,哨兵模式与PHP扩展(PHP7适用)
    php-fpm启动,重启,终止操作
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846192.html
Copyright © 2020-2023  润新知