[C++潜心修炼] operator重载

​          这个又啥用呢?这个用处可大啦,C语言沿袭过来的操作符是不能给自定义类型用的,可这些都是这些都是基础操作符,为了可以使用,就有了运算符重载

且这些重载得操作符的实现可以由你的想象实现没有任何限制

在这里插入图片描述


用法

  • operator(关键字)+运算符+(原来运算符的操作个数)

下面都是写到类里,那么就可以少些一个左操作数,因为默认第一个是this


> < >= <=

这里会看到附用的价值

/>

bool Data::operator>(const Data&d1)
{
    
    
    if(_year>d1._year)
    {
    
    
        if(_month>d1._day)
        {
    
    
            if(_day>d1._day)
            {
    
    
                return true;
            }
        }
    }
    return false;
}

<

这里就是附用类上面的代码

bool Data::operator<(const Data&d1)
{
    
    
    return !(*this>d1);
}


# == !=

==

bool Date:: operator==(const Date&d1)
{
    
    
    if(_year==d1._year)
    {
    
    
        if(_month==d1._month)
        {
    
    
            if(_day==d1._day)
            {
    
    
                return true;
            }
        }
    }
    return  false;
}

附用

bool Date::operator!=(const Date&d1)
{
    
    
    return !(*this==d1);
}



前置/后置++ –

​          这里有一个bug的操作的就是为重载前后置++为了区分就会在形参中加一个int,没加int的是前置,加int的就是后置,且这个是不开空间单纯就是表示

这个前置其实没啥难的,就直接加就好了

Date& Date::operator++()//前置
{
    
    
    _day++;
     return *this;
}

因为返回后置是先使用在++,所以需要一个零时的变量

Date Date::operator++(int day)//后置
{
    
    
    Date tmp(day);//拷贝构造
    ++(*this);
    return tmp;//拷贝构造
}


= (重点)

这里有体现类&用的价值类,我们就不需要去调用拷贝构造

 void operator=(const Date&d1)
    {
    
    
         if(*this!=&d1)//就是自己给自己复制俄罗斯套中套呀
         {
    
    
             _year=d1._year;
             _month=d1._month;
             _day=d1._day;
         }
    }

​          这个就是类中默认成员函数之一(赋值重载),但是上面的代码其实是有一点点小瑕疵的,就是你写代码的时候可能会连续赋值

在这里插入图片描述

​          当d1再去调用赋值重载的时候d1=void所以需要改成这样

   Date& operator=(const Date&d1)
    {
    
    
         if(*this!=d1)//就是自己给自己复制俄罗斯套中套呀
         {
    
    
             _year=d1._year;
             _month=d1._month;
             _day=d1._day;
         }
         return *this;
    }

这样就解决啦



<< >>(重点)

​          这俩个运算符重载和其他的不太一样,他是写在类外面的,看下面的场景

在这里插入图片描述

​          this指针是默认的第一个参数,那么如果写成内部就到导致上面的情况那咋办呢?

那就写在外面呗,可是如何访问里面的数据呢?

  1. 用接口访问
  2. 友元

这里就采用友元比较方便少些点代码

/>>

 istream &operator>>(istream& in,Date d1 )
{
    
    
    in>>d1._year>>d1._month>>d1._day;
    return in;
}

<<

ostream &operator<<(ostream& out,Date d1 )
{
    
    
    out<<d1._year<<d1._month<<d1._day;
    return out;
}

​          按照原来得逻辑来说他也是可以连续插入或者输出,所以他也和赋值重载一样,需要返回值


这里你有没有发现其实他重载之后,就是去调用那个对应重载,就像是函数一样,其实把他这样理解也可以的


​          上面就写类一部分还有部分就留给你们啦

猜你喜欢

转载自blog.csdn.net/Legwhite/article/details/121078901