前言:
我将c++学习以及知识整理以这种短小的笔记形式展现,旨在巩固我的c++知识以及为未来的就业和实习铺路,感谢各位阅读的老师和同学,你们见证着我的成长在这里。
今天练习和学习4点:
(1)运算符重载函数实现复用功能
在学习过程中,我发现了一些比较方便的编写代码的技巧:复用
cpp
//假如已经自定义了一个日期类Date
//Date的私有成员是:_year _month _day
//现在实现运算符+/+=的重载,以完成对日期+天数的功能
//运算符重载函数是成员函数
Date& operator += (int days){
_day += day;
while(_day>getdaynum(_year,_month))
{
_day-=getdaynum(_year,_month);
_month++;
if(_month==13){
_year++;
_month=1;
}
}
return *this;
};
Date Date::operator+(int day){
Date temp=*this;
temp += day;
return temp;
};
我们一旦写好了+=的运算符重载函数,剩下的+我们能完全复用+=的逻辑
而且需要注意的是+=的运算符重载函数是改变类对象的,而+是不应该改变类对象的。
所以对于+=返回的是引用,而+则是返回一个类(是对函数内的改动一个临时类对象的一个拷贝)
(2)究竟是+复用+=逻辑好还是+=复用+逻辑好?
我们可以分析一些对比一下两个写法:
cpp
//+复用+=逻辑:
Date& Date::operator+=(int day){
_day += day;
while(_day>getdaynum(_year,_month))
{
_day-=getdaynum(_year,_month);
_month++;
if(_month==13){
_year++;
_month=1;
}
}
return *this;
};
Date Date::operator+(int day){
Date temp=*this;//第一次拷贝构造函数调用
temp += day;
return temp;//返回时候对temp进行第二次拷贝构造函数
};
//总计两次拷贝构造函数的开销
//+=复用+的逻辑:
Date& Date::operator+=(int days){
*this =*this + days;//计算(*this+day返回一个类对象)后涉1 次赋值操作
return *this;
};
Date Date::operator+(int day){
Date temp = *this;//第二次拷贝构造
temp._day += day;
while(temp._day>getdaynum(temp._year,temp._month))
{
temp._day-=getdaynum(temp._year,temp._month);
temp. _month++;
if(temp._month==13){
temp._year++;
temp._month=1;
}
}
return temp;//返回的时候再来一次拷贝构造
};
//总计2次拷贝构造函数+1 次赋值操作的开销
显然是是+复用+=的效率更高的。
(3)对于++的运算符重载函数需要注意
日期类Date A;
A++;
++A;
这显然是不相同的计算方式,但是如果要写运算符重载,会发现他们的函数名都是:operator++
c++语法给出了明确的区分规则
cpp
//对于后置++:A++
Date operator++(int)
//对于前置++:++A
Date operator++();
(4)利用现成的输入输出流对象来运算符重载
cin是istream类的对象,istream这个类的成员函数种有对>>的运算符重载定义,所以我们才能使用cin>>来完成相应的代码功能,同理cout是类ostream类的对象,cout<<的代码功能自然也早早写入类的成员函数里;
osteam类里的<<运算符重载作为成员函数的声明之一有:
cpp
ostream& operator<<(int val);
......
为此,通过对 >> 和 << 运算符进行重载,我们就可以利用 C++ 中现成的输入流 cin 和输出流 cout,让自定义类型也能够像内置类型一样,以流的形式完成数据的输入和输出。
cpp
istream& operator>>(istream& mycin,Date& a){
cout<<"请输入年月日:";
mycin>>a._year>>a._month>>a._day;
return mycin;
}
ostream& operator<<(ostream& mycont,const Date& a){
mycont<<a._year<<"年"<<a._month<<"月"<<a._day<<"日";
return mycont;
}
void test01(){
Date A,B;
cin>>A;
cin>>B;
cout<<A;
cout<<B;
}