今天写课程设计,其中就要用到类和重载的有关知识,这次写作业对这些知识点有了自己新的理解和感想,借此机会进行阐述一下
重载输出运算符
有关格式如下
ostream &operator<<(ostream&out,class_name&obj)
{
out<<obj.item1; //对象名.数据成员名
out<<obj.item2;
return out;
.......
}
几点注意事项
1、ostream后面的out是可以换的,这里换成什么,后面的函数体就要换成什么,比如说这里改为ostream&output,那么后面的函数体就要都变成output<<obj.item1
2、函数参数表里面的class_name指的是类名。obj指的是对象名
3、class_name写完后,针对这个类的对象,假如使用了重载的运算符,那么对应的就会按照自己对应的功能进行操作,除了重载的这个对象外,平时的cout输出没有变化。
4、obj也就是对象名,这里随便写一个就行,对于后面的东西没有什么影响。需要注意的就是这里写的对象名要与重载函数体中的对象名对应起来,保持一致。
5、重载输出运算符只能使用友元函数,不能重载为成员函数。
6、不要忘记加上return out,否则的话会有warning
重载输入运算符
有关格式如下
istream& operator>>(istream& in,class_name,&obj)
{
in>>obj.item1;
in>>obj.item2;
.....
return in;
}
注意事项
1、只能被重载为有元函数
2、其余几点都和重载输出运算符相同
3、重载输出运算符只能使用友元函数,不能重载为成员函数。
4、不要忘记加上return out,否则的话会有warning
补充有元函数知识
在函数名前面加上friend,在类里面写上,但friend不是类的函数成员。在类里面写上函数原型后,类的外面再写函数体时不需要写friend,也不需要声明作用域是哪个类,因为他根本就不是那个类的函数。
#include<bits/stdc++.h>
using namespace std;
class message
{
private:
int year,month,day;
double balance;
public:
~message(){}
message(int year1,int month1,int day1):year(year1),month(month1),day(day1){}
void setdate(int year1,int month1,int day1);
friend ostream &operator<<(ostream&out,message&s);
friend istream &operator>>(istream&in,message&b);
};
ostream &operator<<(ostream&out,message&s) // 不需要加作用域的声明
{
out<<s.year<<"年"<<s.month<<"月"<<s.day<<"日";
return out;
}
istream &operator>>(istream&in,message&b)
{
in>>b.year>>b.month>>b.day;
return in;
}
void message::setdate(int year1,int month1,int day1)
{
year=year1;
month=month1;
day=day1;
}
int main()
{
message a(2022,12,10);
cout<<a;
return 0;
}