zoukankan      html  css  js  c++  java
  • C++操作符重载

    操作符重载本质上函数重载,只不过函数的名称有点怪,是个运算符。不过这给编程带来了方便,适当重载,可以使得程序变得简洁。

    对于操作符重载,我一直停留在浅尝辄止的程度,对于操作符的细节了解不多。所以今天花时间仔细的研究了一下。

    在众多的操作符中,输入和输出流的操作符虽然平时一直在用,但是最不了解,因此我重点学习了>>和<<的用法。

    首先需要弄清楚cin和cout是什么。cin和cout不是类,而是类的实例对象。cin是istream类的对象,cout是ostream类的对象(以前一直忽视这个问题,cin和cout是什么一直都模模糊糊的)。这样很容易就知道,cin具有istream的所有方法和变量,cout同理。

    然后以cin为例来看>>的使用方法:

    string name;
    cin>>name;

    从上面的例子可以看出>>是一个双目操作符,两个操作数分别是cin和name,所以在重载>>的时候参数列表中应该含有两个操作数,一个是istream类型的对象,另一个是自定义的对象。

    那么>>操作符的返回值是什么?

    事实上,>>操作符可以没有返回值,它的作用是从cin对象中提取数据到变量中,程序可以从输入流中获取数据。需要注意一点,如果只输入一个对象可以没有返回值,如果需要链式输入,那么就要返回输入流的引用,以便和下一个变量运算。

    了解输入流的细节之后,重载才会方向明确。

    下面是一个重载的demo

    class MyString{
    public:
        char arr[100];
        int len;
        MyString(){
            len=0;
            memset(arr,0,sizeof(arr));
        }
        MyString(char in[]){
            strcpy(arr,in);
            len=strlen(arr);
        }
        ///操作符本质就是一个函数
        ///todo 重载<<
        friend void operator<<(ostream& output,const MyString &myString)
        {
            output<<myString.arr;
    //        return output;
        }
        ///todo 重载>>
        friend void operator>>(istream &input,MyString &myString)
        {
            input>>myString.arr;
            myString.len=strlen(myString.arr);
    //        return input;
        }
        ///todo 重载+
        MyString operator+(const MyString &myString)
        {
            MyString rt;
            strcpy(rt.arr,this->arr);
            strcat(rt.arr,myString.arr);
            rt.len=strlen(rt.arr);
            return rt;
        }
        ///todo 重载+=
        MyString operator+=(const MyString &myString)
        {
            MyString t=*this+myString;
            *this=t;
            return *this;
        }
        ///todo 重载*
        MyString operator*(const int n)
        {
            MyString t;
            for(int i=0;i<n ;i++ ){
                strcat(t.arr,this->arr);
            }
            return t;
        }
    };
    int main()
    {
        MyString name1,name2,name3;
        cin>>name1;
        name1=name1*10;
        cout<<name1;
       return 0;
    }

     参考文献

    https://blog.csdn.net/zhangyifei216/article/details/50545572

  • 相关阅读:
    zabbix linux 客户端编译安装
    yum安装grafana
    zabbix 安装和配置
    安装PHP
    wrk压力测试
    新加坡地图
    shell中去除变量去除所有空格或者去除变量首尾空格的常用几种方法
    新鲜出炉!春招-面试-阿里钉钉、头条广告,美团面经分享,看我如何拿下offer!
    面试阿里,字节跳动90%会被问到的Java异常面试题集,史上最全系列!
    最新出炉,字节跳动一二三面面经,看我如何一步一步攻克面试官?
  • 原文地址:https://www.cnblogs.com/MalcolmMeng/p/9255470.html
Copyright © 2011-2022 走看看