目录
1.赋值运算符重载
1.1运算符重载
1.2赋值运算符重载
1.2.1赋值运算符重载格式
1.2.2赋值运算符只能重载成成员函数不能重载成全局函数
1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。
1.3前置++和后置++重载
2.const成员函数
3.取地址及const取地址操作符重载
时光不语,我们都在努力
这里是来自M--Y的专栏:C++启航
以下内容均为个人见解,如有不足还请指出
期待大家的点赞、收藏、评论(互三必回)诸君共勉
类中的6个默认成员函数
1.赋值运算符重载
1.1运算符重载
运算符重载提高代码可读性。函数命名为关键字operator后面接需要重载的运算符符号
特别注意:
1.不能通过连接其他符号来创建新的操作符,如operator@
2.重载操作符必须有一个类类型参数
3.用于内置类型的运算符,其含义不能改变
4.作为类成员函数重载时,其形参看起来比操作数数目少1,这是因为成员函数的第一个参数是隐式的this
5..* :: sizeof ?; .这五个运算符不支持重载
class Date
{
public:
// ……
private:
int _year;
int _month;
int _day;
}
bool operator==(const Date& d1,const Date& d2)
{
//……
}
如果和上述代码一样定义成全局函数的话,就无法访问到Date类中的私有成员变量,如果要使代码编译通过的话,就必须将上述代码标红处给注释掉。
这样处理的话,显得过于麻烦,所以不如将函数封装成成员函数。
封装成成员函数的时候我们需要注意一点,上面注意4提到,成员函数的第一个参数是隐式的this所以在代码上要做些许调整。
class Date
{
public:
bool operator==(const Date& d)
{
return _year==d._year
&&_month=d._month
&&_day==d._month;
}
private:
int _year;
int _month;
int _day;
} ;
1.2赋值运算符重载
1.2.1赋值运算符重载格式
1.参数类型:const T&(传递引用可以提高传参效率)
2.返回值类型:T&。返回引用可以提高效率,同时在有些情况下可以支持连续赋值
3.检测是否自己给自己赋值
4.返回*this。目的:连续赋值,下文会细讲
1.2.2赋值运算符只能重载成成员函数不能重载成全局函数
原因:如果用户将赋值运算符实现成全局的话,编译器就会自己生成一个默认的成员函数,这样两者就会产生冲突了
class Date
{
public:
//……
Date& operator=(const Date&d)
{
_year=d._year;
_month=d._month;
_day=d._day;
return *this;
}
};
1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,用编译器默认生成的就行,但是如果涉及到资源管理就必须要自己实现赋值运算符。
1.3前置++和后置++重载
思考:由上面叙述可以联想到关于++的运算符重载的函数名应该是operator++,但是这样的话如何区分前置++和后置++呢?
为了区分,C++特别规定:后置++重载时多加一个int类型的参数,但是调用时不用传参,编译器会自动传递。
//前置++
Date& operator++()
{
_day++;
_month++;
_year++;
if(_day>GetMonthday())//实现输出某年某月的天数
{
_day-=GetMonthday();
_month++
}
if(_month>=13)
{
_month-=12;
_year++;
}
return *this;
}
后置++
//注意后置++是先是有后+1,因此需要一个临时变量来保存原来的值,所以函数的返回值应该是Date而不是Date&
Date operator++(int)
{
Date temp=*this;
//重复上述前置++步骤
return temp;
}
其实关于运算符的重载有很多+=,-=,+,-,>,<,>=,<=。但是如果每个运算符都按上述方式代码就会显得十分冗长。有没有什么办法呢? 答案是肯定的。
Date& Date:: operator+=(int day)//日期+天数=日期
{
_day += day;while (_day > GetMonthDay(_year, _month))
{
_day -= GetMonthDay(_year, _month);
_month++;
if (_month == 13)
{
_year++;
_month = 1;
}
}while (_day < 0)
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day += GetMonthDay(_year, _month);
}return *this;
}
以上上+=为例,当我们实现一个运算符重载后,和它相关的运算符重载就会变得很简单实现,只需要进行复用就行 。
Date& operator-=(int day)//日期-天数=日期
{
return *this+=-day
}
Date& operator++()
{
return *this+=1;
}
Date operator++(int)
{
Date temp=*this;
*this+=1;
return temp;
}
其他的运算符重载也和这类似,感兴趣的可以自己去尝试实现。
2.const成员函数
用cosnt修饰的成员函数被称为const函数,实际上const修饰的是成员函数中的this,但是一般const修饰变量会加在其前面,而this是隐式的,如何表示修饰的是this呢?
C++规定将cosnt+在函数后面,就表示对this的修饰。
Date operator+(int day) const
{
//……
}
3.取地址及const取地址操作符重载
这两个函数一般不用重新定义,不是特殊情况,编译器会自动生成的够用。
Date* operator&()
{
return this;
}
const Date* operator&() const
{
return this;
}