论坛购物网站开发,上海公司名字,建网站卖饮料,做p2p网站目录
一、拷贝构造函数
1.1 什么是拷贝构造函数#xff1f;
1.2 为什么得是引用#xff1f;
1.3 使用拷贝构造函数
1.4 拷贝构造函数有什么用#xff1f;
二、运算符重载
2.1 什么是运算符重载#xff1f;
2.2 尝试前须知
2.3 常见运算符重载
2.3.1运算符重载
…目录
一、拷贝构造函数
1.1 什么是拷贝构造函数
1.2 为什么得是引用
1.3 使用拷贝构造函数
1.4 拷贝构造函数有什么用
二、运算符重载
2.1 什么是运算符重载
2.2 尝试前须知
2.3 常见运算符重载
2.3.1运算符重载
2.3.2运算符重载
2.3.3前置和后置运算符重载
三、下期预告 前言C初阶系列每一期博主都会使用简单朴素的语言将对应的知识分享给大家争取让所有人都可以听懂C初阶系列会持续更新上学期间将不定时更新但总会更的 一、拷贝构造函数
1.1 什么是拷贝构造函数 拷贝构造函数是构造函数的重构也就是说它也没有需要返回的东西同样是为了构造成员而生。 拷贝构造函数只有单个形参该形参是对本类类型对象的引用(一般常用const修饰)在用已存在的类类型对象创建新对象时由编译器自动调用。 1.2 为什么得是引用
为什么这个形参得是被类对象的引用呢我直接传递我这个要拷贝的目标不可以吗不是一样的操作吗。有如下代码就完美的符合你的想法
#includeiostream
using namespace std;
class Date
{
public:Date(int year 1,int month1,int day1){_year year;_month month;_day day;}Date(Date date){_year date._year;_month date._month;_day date._day;}
private:int _year;int _month;int _day;
};
int main()
{}
现在的编译器很智能直接就阻止了你的无穷递归行为为什么会发生无穷递归呢。 这样说吧假设你有一个Date d和你个test函数你想将d传递给test函数于是编译器就会调用这个拷贝构造函数而调用这个拷贝构造函数的时候你会生成一个叫做date的形参而这个形参刚好也是Date类型的变量那么它也会走向这个拷贝构造函数于是拷贝构造函数调用拷贝构造函数再调用拷贝构造函数....... 1.3 使用拷贝构造函数 简单的拷贝并打印一下代码什么的自己去敲一遍效果好一些别光看至于为什么要加const是因为我们传递过去的变量是被拷贝的是不会被修改的 加个const是为了避免一些低级错误的发生比方说修改到了被拷贝的对象同时增加了代码的可读性。 1.4 拷贝构造函数有什么用 学到这里大家恐怕也是明白了拷贝构造函数就是简单地将目标内容拷贝给新定义的对象罢了 那么它有用吗这是很多初学者的疑惑实际上它不仅仅是有用它是很有用。 比方说我们现在实现的日期类的拷贝构造函数其实只是涉及到了一个简单的值拷贝而到后期我们使用什么栈啊堆啊二叉树之类的东西我们如果还是简单地进行值拷贝我们拷贝的东西不就只有一具空壳吗我们得采取一些方式实现深拷贝也就是把栈里面的值都给拷贝出来的那种拷贝如此才可以保证这两个东西一模一样才能够达到预期的效果。 二、运算符重载
2.1 什么是运算符重载 其实很多小伙伴应该在使用C语言的时候就有过这样的苦恼我这结构体结构体没法玩啊我得用.或-获取结构体成员才能够对里面的成员进行操作啊太费劲了就是写了个函数还得来个d3addition(d1,d2);就不能d1d2吗 在C中是可以实现的这个操作就叫做运算符重载也就是对运算符进行补充定义。 2.2 尝试前须知 operator用在运算符重载上比方说运算符的重载在进行重载部分的书写时我们就得在之前加上operator,大概可以用这个公式阐述返回类型operator重载的运算符(参数) 运算符重载既可以写在类的里面也可以写在类的外面 而写在类的外面我们往往会用到一个操作叫友元这个操作的大致意思就是令你这个在类外面的东西成为我这个类的朋友因此你这个类外面的东西就可以访问到类中private中的内容对于友元这里不再赘述之后会进行讲解。 有的小伙伴又会有些问题那么我们直接把private去掉或者不在private中定义成员变量。我想说的是这样多少有点舍本逐末了因为在C中之所以会有类的原因有一部分就是因为多个结构体的函数和变量过于混乱而按你的方法去做那么这个类的成员变量所有人都可以进行操作那哪还有什么规矩这个类的创建又有什么意义 因此博主在进行运算符重载的时候使用的方法是在类中进行运算符重载这样既可以访问到私有的成员变量还可以保证代码的严谨性。 注意 1.不能通过连接其他符号来创建新的操作符比如operator 2.重载操作符必须有一个类类型参数 3.用于内置类型的运算符其含义不能改变例如内置的整型不 能改变其含义 4.作为类成员函数重载时其形参看起来比操作数数目少1因为成员函数的第一个参数为隐 藏的this 5. .* :: sizeof ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。这5个死记硬背记住就ok了。
2.3 常见运算符重载
2.3.1运算符重载
目标实现一个日期天数日期被修改为过了多少天的日期 很多人第一次写会写成这样而编译器报错是因为多了一个this指针过去已经达到了三目运算符的操作了 因此我们只需要把Date d1去掉即可但因为有this指针的存在我们一样能对这个变量进行操作。 实现这个之前我们可以写一个GetMonthDay函数来获得没一月份的天数值得注意的一点是闰年时2月为29日接着我们来讲讲实现思路我们的返回值最好设置成Date型的因为操作的目标出了函数作用域在main中依然存在因此使用Date类型的返回值可以令编译器的效率得到提高。 可以先在目标的_day上加上day这样能方便之后的进位比方说2023-11-16 100就先处理成2023-11-116之后通过GetMonthDay取得的具体进位数据来进行进位即可这里就可以通过循环实现当_dayGetMonthDay时意味着需要进位因此可以以这个来作为循环是否继续的条件之后的实现便只需要注意一些细节即可比方说月满12进1之类的。 int GetMonthDay(int year, int month){int arr[13] { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//之所以是13是为了更加符合日期的返回一月就返回数组下标为1的值if (month 2 ((year % 4 0 year % 100 ! 0) || year % 400 0)){return 29;}return arr[month];}Date operator (int day){_day day;while (_day GetMonthDay(_year,_month)){_day - GetMonthDay(_year, _month);_month;if (_month12){_month 1;_year;}}return *this;}
测试 2.3.2运算符重载 有了运算符之后运算符就很好操作了复用一下就好
使用临时变量的原因是因为运算符并不改变原来变量的值比方说ab100;这里的b也不会被修改 Date operator(int day){Date tmp *this;tmp day;return tmp;}
2.3.3前置和后置运算符重载 在C中前置和后置如果我们要对它进行重载你就会惊讶的发现它们两的运算符名字其实是一模一样的这怎么进行区分呢祖师爷其实也没有太好的办法他对这个地方做了特殊化处理就像我们做oj题时遇到的特殊情况单独处理一样。祖师爷也是这么做的他规定前置和后置的区别就在于后置的参数有个int型的 什么意思差不多是这样operator()operator(int)前面的就代表着前置后面的那个就代表着后置那为什么是int不能是float吗。我只能这么说这是巧合祖师爷就想拿int来区分仅此而已。 有了和实现起来就直接复用就好了 三、下期预告
大概在明天博主会来一篇日期类实现详解那里面会讲到友元操作期待你的到来QAQ 文章转载自: http://www.morning.rkypb.cn.gov.cn.rkypb.cn http://www.morning.ngkgy.cn.gov.cn.ngkgy.cn http://www.morning.clbsd.cn.gov.cn.clbsd.cn http://www.morning.skrrq.cn.gov.cn.skrrq.cn http://www.morning.ndtzy.cn.gov.cn.ndtzy.cn http://www.morning.pbbzn.cn.gov.cn.pbbzn.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.nzwp.cn.gov.cn.nzwp.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.zwznz.cn.gov.cn.zwznz.cn http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.xbdrc.cn.gov.cn.xbdrc.cn http://www.morning.ktcrr.cn.gov.cn.ktcrr.cn http://www.morning.rmdwp.cn.gov.cn.rmdwp.cn http://www.morning.grbp.cn.gov.cn.grbp.cn http://www.morning.hknk.cn.gov.cn.hknk.cn http://www.morning.thbkc.cn.gov.cn.thbkc.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn http://www.morning.tntbs.cn.gov.cn.tntbs.cn http://www.morning.rmdsd.cn.gov.cn.rmdsd.cn http://www.morning.yslfn.cn.gov.cn.yslfn.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.pumali.com.gov.cn.pumali.com http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn http://www.morning.rxtxf.cn.gov.cn.rxtxf.cn http://www.morning.gqtxz.cn.gov.cn.gqtxz.cn http://www.morning.pxlql.cn.gov.cn.pxlql.cn http://www.morning.banzou2034.cn.gov.cn.banzou2034.cn http://www.morning.kehejia.com.gov.cn.kehejia.com http://www.morning.psxxp.cn.gov.cn.psxxp.cn http://www.morning.zphlb.cn.gov.cn.zphlb.cn http://www.morning.mkpqr.cn.gov.cn.mkpqr.cn http://www.morning.zyrcf.cn.gov.cn.zyrcf.cn http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn http://www.morning.txmkx.cn.gov.cn.txmkx.cn http://www.morning.fqtdz.cn.gov.cn.fqtdz.cn http://www.morning.nynpf.cn.gov.cn.nynpf.cn http://www.morning.lzttq.cn.gov.cn.lzttq.cn http://www.morning.qnksk.cn.gov.cn.qnksk.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.tmtrl.cn.gov.cn.tmtrl.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.mtymb.cn.gov.cn.mtymb.cn http://www.morning.dpjtn.cn.gov.cn.dpjtn.cn http://www.morning.c7498.cn.gov.cn.c7498.cn http://www.morning.znnsk.cn.gov.cn.znnsk.cn http://www.morning.rflcy.cn.gov.cn.rflcy.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.tzpqc.cn.gov.cn.tzpqc.cn http://www.morning.lstmg.cn.gov.cn.lstmg.cn http://www.morning.zsyqg.cn.gov.cn.zsyqg.cn http://www.morning.skrcn.cn.gov.cn.skrcn.cn http://www.morning.xwlhc.cn.gov.cn.xwlhc.cn http://www.morning.qrqg.cn.gov.cn.qrqg.cn http://www.morning.qwbtr.cn.gov.cn.qwbtr.cn http://www.morning.lsxabc.com.gov.cn.lsxabc.com http://www.morning.zcqtr.cn.gov.cn.zcqtr.cn http://www.morning.jhswp.cn.gov.cn.jhswp.cn http://www.morning.rxkq.cn.gov.cn.rxkq.cn http://www.morning.tqgx.cn.gov.cn.tqgx.cn http://www.morning.qfdmh.cn.gov.cn.qfdmh.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.tymwx.cn.gov.cn.tymwx.cn http://www.morning.tslwz.cn.gov.cn.tslwz.cn http://www.morning.ssfq.cn.gov.cn.ssfq.cn http://www.morning.lzzqz.cn.gov.cn.lzzqz.cn http://www.morning.qrsm.cn.gov.cn.qrsm.cn http://www.morning.hkchp.cn.gov.cn.hkchp.cn http://www.morning.tfwr.cn.gov.cn.tfwr.cn http://www.morning.bmbnc.cn.gov.cn.bmbnc.cn http://www.morning.qjmnl.cn.gov.cn.qjmnl.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.mpscg.cn.gov.cn.mpscg.cn http://www.morning.zbqsg.cn.gov.cn.zbqsg.cn http://www.morning.wglhz.cn.gov.cn.wglhz.cn http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn