zoukankan      html  css  js  c++  java
  • 5. 操作符重载与临时对象

    1. 操作符重载之一:把操作符重载成成员函数

    在C++里面,操作符是一种函数,这是C++的一大特点。

    操作符重载的原因:

    • 因为函数库中没有两个复数直接相加的函数,只有实数和实数相加的函数,如1.2+2.3=3.5。

    对于成员函数:+=

    • c2调用了+=,c2就是this,或者说this此时就指向了c2(this是一个指针).

    2. return by reference的故事(传递者无需知道接收端是以by reference还是by value的形式接收object,如果是前者,就收的就是object的地址)

    3. 返回值是写void还是写一个具体类型的故事

    如果使用者只是这样调用+=这个重载函数:c2+=c1,那么返回类型complex&写成void是没有问题的。但如果这样调用:c3+=c2+=c1,返回void类型的话,就有问题了。

     

    4. 在class body(类区域)外面定义函数

    5. 操作符重载(操作符是非成员函数的情况,无隐含参数this(指针))

    为了应付客户的3种可能用法,需要在类体外写3个对应的处理加法的函数

    • (1)复数+复数 c1+c2
    • (2)实数+复数 5+c1
    • (3)复数+实数 c1+7

     5. 临时对象(temp object)的故事

    下面这些函数绝对不可以return by reference, 因为,它们返回的必定是个local object.

    一定要return by value.

    typename();(类名后面+小括号),这是一个特殊语法,是创建临时对象的特殊语法。如下面的complex()就是在创建临时对象,临时对象的生命周期就是这创建的那一行,到下一行生命就结束了。

     

     再比如:

    6. 单目运算符+,-的重载(正号操作,取反操作)

    第一个正号操作,返回的是原来的东西,没有产生新的东西(新的local object,而下面代码中取反的操作产生了新的东西),那完全可以retrun by reference啊,这个是标准库里面的东西,那么厉害的人会注意不到这一点吗?有可能。这里其实可以retrun by reference。complex后面可以加个&

    网友1:因为参数是const complex& x(const 型变量引用),如果返回值是引用的话,相当于去掉了const. 所以还是应该return by value. 实验了一下,果然是这样,retrun by reference(即写成inline complex&)的话,生成解决方案的时候会出错:错误C2440“return”: 无法从“const complex”转换为“complex &”

    网友2:因为传入的参数是const类型的引用,如果将返回值改成引用,相当于将const类型转换为非const类型,这在编译上是通不过的。

    7. 双目操作符“==”的重载

    3种情况:

    • 判断一个复数是否等于另一个复数
    • 判断一个实数是否等于另一个复数
    • 判断一个复数是否等于另一个实数

    写一个函数一般考量两个点,这两点影响着程序执行的效率:

    • 传参数要不要by reference?
    • 返回值传递要不要by reference?

    8. 双目操作符“!=”的重载

     9. 共轭复数

     

    9. 重载输出操作符“<<”进行复数或者共轭复数的输出

    可以说的有以下几点:

    • 参数传递,均是pass by reference;
    • 返回值传递,return by reference;
    • 如果不是连续输出,函数的返回值类型可以设计成void,如果使用连续输出,函数的返回值类型不能是void类型;
    • “<<”是双目运算符,需要提供2个参数;
    • 运算符永远是作用在左边的对象上,没有作用在右边上的;
    • “<<”左边的“cout”是一个对象,这个对象的类别是:ostream,标准库中有这样一句:
      就像对象c1的类别是complex,对象7的类别是int,对象7.9的类别是double一样;
    • cout<<c1; 这一句会返回一个ostream类型的对象(的引用);
    • 返回类型不可以加"const",因为连续输出的时候被丢到屏幕上的东西一直在变,即每有一个新的输出变量“os”的状态就会发生变化(由于这个原因,ostream& os的前面不可以加const修饰符),相当于一个变量的值一直在发生变化;
    • 这段代码是标准库中提供的例子。

  • 相关阅读:
    Spring&AOP&JDK和Cglib动态代理&AspectJ进行AOP开发(XML方式)
    python 切换工作目录
    python 布隆过滤器
    python sys.path.append()
    python encrypt 实现AES加密
    python 魔术方法
    python re匹配中文和非中文
    python 文件整理 shutil
    python定时任务框架
    mac 系统修改环境变量
  • 原文地址:https://www.cnblogs.com/yibeimingyue/p/12294244.html
Copyright © 2011-2022 走看看