做网站必须搭框架么,家教中介怎么利用网站来做的,网站优化比较好的公司,营销网站建设文章#x1f496;作者#xff1a;小树苗渴望变成参天大树 ❤️#x1fa79;作者宣言#xff1a;认真写好每一篇博客 #x1f4a8;作者gitee:gitee #x1f49e;作者专栏#xff1a;C语言,数据结构初阶,Linux,C 文章目录 前言一、案例引入二、的重载三、的… 作者小树苗渴望变成参天大树 ❤️作者宣言认真写好每一篇博客 作者gitee:gitee 作者专栏C语言,数据结构初阶,Linux,C 文章目录 前言一、案例引入二、的重载三、的重载四、总结 前言
今天根据上篇讲的日期类的实现来简单的讲解一下大概怎么重载输入输出运算符其他类也可以参考这个方法来使用这个那我们开始进入正文的讲解 一、案例引入
接上一篇我们写了好多运算符重载我们将结果用一个成员函数给打印出来了 对于C我们的输入输出使用的都是cin和cout因为他能实现对内置类型的输入输出很方便对于自定义类型我们需要使用成员函数对象再来调用就显得格格不入想要实现像内置类型的那种我们就需要进行运算符重载这样就可以直接使用cin和cout.
二、的重载
我们真正需要重载的是流插入和流提取运算符cout只是他其中的一个操作数我们目前想要实现的效果是这样的
coutd1;类似于
d1d2;这样的二元运算符只有两个操作数
我们再来写一个类
class date
{
public:date(int year 1, int month 1, int day 1)//全缺省的构造函数{_year year;_month month;_day day;}
private:int _year;int _month;int _day;
};我们的cout和cin分别再类osream和istream类里面所以我们每次都需要导入 iostream和std的展开 我们再按照之前运算符的写法再类里试着重载一下流插入
void operator(ostream cout)
{cout _year 年 _month 月 _day 日 endl;//这是内置类型所以可以直接这么写
}这样居然不行原因是运算符的左操作数默认传给隐藏的this我们按照下面这么些就可以了
d1cout;但是这么写太别扭了我们只能将这个函数写成全局的了传两个参数就好了
void operator(ostream cout, const date d)
{cout d._year 年 d._month 月 d._day 日 endl;
}这样写访问不了成员变量有两种解决办法 1.使用函数将成员变量返回出来 2.使用友元函数 大家有没有发现我们使用第一种和第二种的时候第二个参数有的加了const有的没加原因就是要理解隐含指针的类型以此类为例隐含的this类型是date*,而这个是对象的地址对象加const那么取地址之后的类型应该为const date*,当你第一种方法加const,那d.getyear()就相当于d.getyear(const date*d),而getyear()成员函数的参数类型应该是date*的所以出现参数不匹配的情况会报错像要解决这个问题要不去点const,要不再成员函数前面加const修改就行了调用内置类型就不会出现这样的问题。 下篇写类和对象中篇完结的时候我在重点讲解一下需要再理解我写的C入门这篇博客关于引用的知识点const修饰的变量引用怎么使用把那个弄懂应该问题不大 但是这个写的还不是特别完美我们想要达到像输出内置类型那样一次输出多个数据
coutd1d2d3;我们想要达到上面这种效果就要知道为什么可以这么写再之前连续赋值的运算符那一块我讲过是从有往左赋值有返回值那么对于这个是从左往右返回值应该为cout的类型不然没办法往右运行
ostream operator(ostream cout, const date d)
{cout d._year 年 d._month 月 d._day 日 endl;return cout;
}我这里是通过友元来访问成员变量的因为cout也是对象出来函数体没有被销毁所以可以使用引用返回。 说明对于第一个参数我为什么没有加const修饰原因是这是流插入运算符往cout里面插入数据所以不能使用从const修饰。
三、的重载
我们刚才讲解了流插入运算符现在按照上面的函数来写流提取操作符这个也要写成全局函数使用友元函数上面一样的道理也可以连续输入好几个数据也有返回值cin是类istream的对象我们来看看具体函数形式
istream operator(istream cin, date d)
{cin d._year d._month d._day;return cin;
}第二参数不加入const大家应该明白第一个参数刚才说对于流插入是不用加但是这里是流提取为什么也不需要加const呢原因是cin里面有的数据也还是会发生改变的不是完全不变的所以不加const。 对于日期类我们再上篇也讲过有的日期输入不合理再上面我们会修改构造函数里面的内容加一个判断就好了这里也是一样的但有一个细节要注意
istream operator(istream cin, date d)
{int year, month, day;cin year month day;if (day 0 day date::getmonthday(year, month)month0month13){d._year year;d._month month;d._day day;}else{cout 非法输入 endl;}return cin;
}注意的点就是我们再之前写过一个获取月份天数的函数但是睡哦可以写成全局也可以写在类里面对于写在全局的可以直接调用但是写在类里面必须使用对象名去调用也可以再函数前面加一个static来使用类名来调用加static那么就没有隐藏的this了。这个再后面再重点介绍。
四、总结
对于这个重载好多类都是可以参照这个来写里面的内容可能要调整根据具体的类来写这里面的友元函数我在类和对象下篇会再具体介绍的这里也相当于铺垫了大家现在不懂没有关系知道就行了我们今天这篇博客不难就是细节比较多大家要注意好我们下篇再见