zoukankan      html  css  js  c++  java
  • c++重载运算符注意

          c++重载运算符的时候加&或不加:

    如果加了&表示引用,说明用的都是同一块内存。如果不加,那么用的就是一份拷贝,即不同的内存。

    一般连续操作的时候要加&。

          可以重新定义一个对象,然后返回这个对象,这样就不会改变当前对象的值;也可以直接在当前对象

    上进行操作,返回*this,这样会改变当前对象的值。

    这个代码能说明我想说的。

    #include<iostream>
    #include<Windows.h>
    using namespace std;
    class Sample{
    private:
        int *p,len;
    public:
        Sample(){len=0;}
        Sample(int *a,int l);
        Sample(Sample &fp);
    
        Sample operator = (Sample);
        Sample operator + (Sample);
        bool operator == (Sample);
        Sample& operator ++ ();
        Sample operator ++ (int);
        ~Sample(){
            if(len)
                delete[] p;
        }
        void display()
        {
            for(int i=0;i<len;i++)
                cout<<p[i]<<" ";
            cout<<endl;
        }
    };
    Sample::Sample(int *a,int l)
    {
        int i;
        len=l;
        p=new int[l];
        for(i=0;i<len;i++)
            p[i]=a[i];
    }
    Sample::Sample(Sample &fp)
    {
        p=new int[fp.len];
        len=fp.len;
        for(int i=0;i<len;i++)
            p[i]=fp.p[i];
    }
    bool Sample::operator == (Sample t)
    {
        if(len==0&&t.len==0)
            return true;
        if(len!=t.len)
            return false;
        for(int i=0;i<len;i++)
        {
            if(p[i]!=t.p[i])
                return false;
        }
        return true;
    }
    Sample Sample::operator = (Sample t)
    {
        p=new int[t.len];
        len=t.len;
        for(int i=0;i<len;i++)
            p[i]=t.p[i];
        return *this;
    }
    Sample& Sample::operator ++ ()
    {
        for(int i=0;i<len;i++)
            p[i]++;
        return *this;
    }
    Sample Sample::operator ++ (int)
    {
        Sample old=*this;
        ++(*this);
        return old;
    }
    Sample Sample::operator + (Sample t)
    {
        int i;
        Sample fp;
        if(len>t.len)
        {
            fp.p=new int[len];
            fp.len=len;
            for(i=0;i<len;i++)
                fp.p[i]=p[i];
            for(i=0;i<t.len;i++)
                fp.p[i]+=t.p[i];
        }
        else 
        {
            fp.p=new int[t.len];
            fp.len=t.len;
            for(i=0;i<t.len;i++)
                fp.p[i]=t.p[i];
            for(i=0;i<len;i++)
                fp.p[i]+=p[i];
        }
        return fp;
    }
    int main()
    {
        int a[15],b[15],c[15],i;
        int lena,lenb,lenc;
    
        cout<<"输入a[]的长度: ";cin>>lena;
        cout<<"输入a[]:  ";
        for(i=0;i<lena;i++)
            cin>>a[i];
        cout<<"输入b[]的长度: ";cin>>lenb;
        cout<<"输入b[]:  ";
        for(i=0;i<lenb;i++)
            cin>>b[i];
        cout<<"输入c[]的长度: ";cin>>lenc;
        cout<<"输入b[]:  ";
        for(i=0;i<lenc;i++)
            cin>>c[i];
    
        Sample t1(a,lena),t2(b,lenb),t3(c,lenc),t4,t5;
        cout<<"t1: ";t1.display();
        cout<<"t2: ";t2.display();
        cout<<"t3: ";t3.display();
    
        cout<<endl;
    
        if(t1==t2)
            cout<<"t1==t2 is true"<<endl;
        else cout<<"t1==t2 is false"<<endl;
    
        cout<<"t4=t2: ";
        t4=t2;
        t4.display();
    
        cout<<"t5=t2+t3: ";
        t5=t2+t3;
        t5.display();
    
        cout<<"t1++ : ";
        t1++;
        t1.display();
    
        cout<<"++t1 : ";
        ++t1;
        t1.display();
        system("pause");
    }
    /*
    5 1 2 3 4 5 4 1 2 3 4 3 1 2 3
    */
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别
    Linux 系统时间设置
    Redis入门
    线程安全的单例模式
    redis-Sentinel配置
    openpose
    Qt5.11参考文档
    opencv3.3
    opencv3.4 win10 visual studio2017 opencv_contrib 编译
  • 原文地址:https://www.cnblogs.com/sweat123/p/4944063.html
Copyright © 2011-2022 走看看