zoukankan      html  css  js  c++  java
  • C++之运算符重载(一元)

     

    一、-符号重载

    1.成员函数重载负号

    2.友元函数重载负号

    3.补充说明

    <1> 《一元运算符编码实现(一)》课程笔记:

    A:事实上,我们的重载运算符返回void、返回对象本身、返回对象引用都是可以的,并不是说一定要返回一个引用,只不过在不同的情况下需要不同的返回值。

    那么什么情况下要返回对象的引用呢?

    原因有两个:1.允许进行连续赋值2.防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。

    对于第二点原因:如果用”值传递“的方式,虽然功能任然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,会降低赋值函数的效率。

    B:用友元函数重载时,参数之所以用引用类型,也是因为原因2,为了降低开销,提高效率。

     

    <2> 《一元运算符编码实现(二)》课程笔记:

    但是看了这一节,发现后置++的返回值是对象而非引用,因为,如果返回是引用,那么返回的是一块临时变量(old)的引用,

    当后置++的函数调用结束后,该临时变量会被自动释放掉,那么返回的引用的值就会是一个-37983219之类的为初始化的值了,发生bug。

    二、++符号的重载

    1.前置++重载

    2.后置++重载

    《一元运算符编码实现(二)》课程笔记:


    operator定义了多个函数重载,定义了能传入一到两个参数的operator

    为什么后置要传入int?

    在一元operator中,运算符要放在参数前面,也就是operator++(*this),在程序中调用一元运算符的格式:

    ++coor,-coor

    operator(int)其实是二元函数,只是第二个参数是通过隐性的方式传入参数,传入int就相当于定义了二元运算符,也就是(this*, int),

    这时运算符的格式就是this*指针加运算符加int类型,再给int传入一个默认值1

    例如c++1,这就满足了运算符的格式,因此在使用时变成了c++,函数会执行,而内部如何处理,就由我们随便处理。


    为什么定义友元类的时候就要传入参数?

    因为如果在类中定义非友元运算符(成员函数),那么默认将传入一个*this指针。

    而在定义友元类,在类外定义函数,其实就是给予一个函数对该类所有对象数据的修改权限

    但是这个函数默认不会传入*this指针,因为需要在参数表中传入

    例如 在类的定义中定义了Coordinate& operator-()

    系统默认传入了一个this指针

    而在友元运算符中,因为opertor必须至少传入一个参数,因此需要传入一个coordinte对象。

  • 相关阅读:
    python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义
    mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
    提交 git 项目 到 github 在 centos 7
    常用正则表达式大全 (转)
    如何让vim编辑器永久显示行号
    Ubuntu下忘记MySQL密码重设方法
    Base64复习
    好用的正则表达式工具
    64位centos下安装python的PIL模块
    springboot中使用servlet通过配置类
  • 原文地址:https://www.cnblogs.com/Tang-tangt/p/9678178.html
Copyright © 2011-2022 走看看