zoukankan      html  css  js  c++  java
  • # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符

    标签(空格分隔): c++


    前言

    我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写。出现了很多bug,而且搜索网上东西也比较少,所以特地写这一篇来分享给大家,同时加深印象。有出错的地方希望给位朋友斧正。


    先看例子, 我定义一个类 Int 和我们基础的c++ int是一个意思

    using  namespace std;
    #include <iostream>
    class Int
    {
        int data;
    public:
        Int &operator++();                                          //前置++
        operator int();                                             //转换运算符
        Int operator++(int) ;                                       //后置++
        Int &operator--() ;                                          //前置--
        Int operator--(int) ;                                       //后置--
        Int operator-() ;                                           //负号运算符
        friend ostream & operator<<(ostream &out, Int& a) ;         //输出运算符号
        friend istream & operator >> (istream &in, Int& a) ;        //输入运算符号
    
    };
    

    1.前置与后置++ 前置–和后置–

    首先明确的是咱们c和c++ 的前置++和后置++ 都是重载的++ 那他们的重载怎么写呢?

        Int& Int::operator++() {         //前置++
            this->data++;    
            return  *this;
        }
    
    
        Int Int::operator++(int) {        //后置++
            Int tmp(*this);
            this->data++;
            return  tmp;
        }
    
        Int& Int::operator--() {     //前置--
            this->data--;
            return  *this;
        }
    
        Int Int::operator--(int) {    //后置--
            Int temp(*this);
            this->data--;
            return  temp;
        }
    

    Int& Int::operator++() //前置++
    Int Int::operator++(int) //后置++
    细心的朋友已经发现了 关键在于后置的重载++ 首先返回的是Int而不是 对象的引用, 然后在最后面(int)加了int参数 。 第一个问题好解决,因为我后置++函数返回的是tmp这个临时对象,在函数结束后被释放了,所以当然不能传引用啦, 对于第二个问题,这个是c++的规定。好吧我也很无语。只要在重载操作符的参数中加上一个int型参数,记住你改成double 都会错的。

    前置–和后置–原理与前面相同,代码相似,不予复述。

    2类型转换函数

    转化运算符, 就是把类的对象转化成其他(基本类型,或其他类型)

        Int::operator int() {           //转换运算符
            return data;
        }

    函数形式里不能有返回值,不能有参数,只能返回要转换的数据类型。 这里int是我要转化的类型所以我括号前是写int 返回的也是int 类型。

    用于处理这样的问题

    int c = 0;
    Int c1(2);
    c = c1;   //这时 c1调用类型转换函数 对象c1返回了int 赋给变量c

    3负号重载

        Int Int::operator-() {     //负号运算符
            Int tmp;
            tmp.data = -data;
            return  tmp;
        }

    函数形式里,不能有参数,返回对象(不能是引用原因和后置++相同)。
    记住要用一个临时的tmp来储存变负的对象属性值,返回tmp
    下面是错误的写法:

        Int Int::operator-() {     //负号运算符
            data = -data;
        }

    重载-号的意思不是直接改变对象的符号,是返回一个符号相反的对象,举个例子,-5不是说把5改成负数,是得到5的相反数,准确说,负号有两个重载,取反操作符和减号操作符,这个是前者


    4输入输出重载

    ostream & operator<<(ostream &out, Int& a) {          //输出运算符号
            out << a.data;
            return out;
        }
    
    istream & operator >> (istream &in, Int& a) {        //输入运算符号
            in >> a.data;
            return in;
        }
    

    提几个小问题吧, 首先所有参数都是引用不是对象(尤其是输入函数不传引用,输入函数不改变值) 然后要记得 istream是用在输入中 不要用反, 不要加作用域运算符。

  • 相关阅读:
    中断子系统5_电流层处理
    太极拳透劲的原理推测
    OpenSSL命令---pkcs7
    初步分析美国科研项目申报项目
    OpenSSL命令---pkcs8
    C#中Hashtable的用法
    android 中 ViewPager 的平常用法 ViewPager+ Views
    打卡汇报
    OpenSSL命令---pkcs12
    卡卡游戏引擎之快速入门
  • 原文地址:https://www.cnblogs.com/qq874455953/p/9589224.html
Copyright © 2011-2022 走看看