对于自定义类型可以自定义它的运算规则,我们来看看以下一些问题
1.哪个操作符不能被重载 ( )
A.-> | B.() | C.. | D.[] |
C++规定,不能被重载的运算符只有5个, 点号. 三目运算?: 作用域访 问符:: 运算符sizeof 以及.*
所以这题正确答案是C。
2.在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是 ( )
A.无操作数的运算符 |
B.二元运算符 |
C.前缀一元运算符 |
D.后缀一元运算符 |
没有如何参数,其实并不是真的没有传参数,而是只隐式的传了一个this指针,所以只有一个参数。至于如何判断前缀还是后缀,就++和--而言,前置无需传参,而后置需要传int。所以区分前缀后缀时,后缀运算需要加一个int参数。显然参数表没有如何参数那么这个运算符就一定是后缀一元运算符。
所以这题正确答案是D。
3.若要对data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )
A.Data operator+(Data); |
B.Data operator(Data); |
C.operator+(Data,Data); |
D.Data+(Data); |
既然是函数的声明,就一定得有返回值,参数,以及正确的函数名。我们期望它返回的也是Date这个类,故这里+运算符的返回值是Date。又因为传参时第一个操作数会被隐式的传成this指针,所以进行+操作时只需传第二个操作数。运算符重载的格式是:函数名字为关键字operator后面接需要重载的运算符符号。 综上所述,只有A选项符合函数声明。
所以这道题正确答案是A。
下列关于赋值运算符“=”重载的叙述中,正确的是( )
A.赋值运算符只能作为类的成员函数重载 |
B.默认的赋值运算符实现了“深层复制”功能 |
C.重载的赋值运算符函数有两个本类对象作为形参 |
D.如果己经定义了复制拷贝构造函数,就不能重载赋值运算符 |
A. 赋值运算符在类中不显式实现时,编译器会生成一份默认的,此时用户在类外再将赋值运算符重载为全局的,就和编译器生成的默认赋值运算符冲突了,故赋值运算符只能重载成成员函数。B.默认的赋值运算符是按成员成员,属于浅赋值。C.参数只有一个,另一个通过this指针传递。D.两个函数的调用场景不同,相互没有影响
所以这道题的正确答案是A。
接着,在来看看这些问题:
描述
根据输入的日期,计算是这一年的第几天。
保证年份为4位数且日期合法。
输入描述:
输入一行,每行空格分割,分别是年,月,日
输出描述:
输出是这一年的第几天
这里要输出是这一年的第几天,很容易就能想到用该日期减去这一年的第一天,简单点说就变成了两个类的减法。
由于日期类的基本运算符已经在运算符重载 中实现过,这里不再赘述
对于该年的第一天,我们仅需传year即可,月和天可以用缺省值初始化
Date d1(year, month, day);
Date d2(year);
这样就完成了计算:
牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)
2.日期差值_牛客题霸_牛客网 (nowcoder.com)
描述
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入描述:
有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出描述:
每组数据输出一行,即日期差值
和上面题目非常类似,只要我们能完成类里面的运算符重载,那就很简单了,这题不做过多解释
牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 (nowcoder.com)
3.打印日期_牛客题霸_牛客网 (nowcoder.com)
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
同样,这题也可以使用运算符重载: