[C++潜心修炼] operator重载
Posted 一个正直的男孩
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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指针是默认的第一个参数,那么如果写成内部就到导致上面的情况那咋办呢?
那就写在外面呗,可是如何访问里面的数据呢?
- 用接口访问
- 友元
这里就采用友元比较方便少些点代码
/>>
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;
}
按照原来得逻辑来说他也是可以连续插入或者输出,所以他也和赋值重载一样,需要返回值
上面就写类一部分还有部分就留给你们啦
以上是关于[C++潜心修炼] operator重载的主要内容,如果未能解决你的问题,请参考以下文章