HM121 两个人怎么相加
HM121 两个人怎么相加
来源: 第 121 集 类和对象-C++运算符重载-加号运算符重载
难度: 入门
时间限制: 1s
空间限制: 64MB
题目描述
加号对内置整数有确定含义:编译器知道 \(1+1=2\)。两个自定义类型的对象相加时,编译器不知道该把哪些字段加到一起,因而没有与这些操作数匹配的加号运算符。要让自定义类型也能写 p3 = p1 + p2,必须给加号重新定义,这就是运算符重载。
请定义人员类型 Person,每人有两个整数属性 mA、mB。相加规则如下:
两个人相加(成员函数重载)
实现成员函数Person operator+(const Person& other):新建一个临时对象,把它的mA设为this->mA + other.mA,mB设为this->mB + other.mB,再按值返回这个新对象。
成员函数的本质调用是p1.operator+(p2),它可以简化成p1 + p2。两种写法必须得到同一结果。人和整数相加(全局函数重载)
运算符重载也可以发生函数重载:同一函数名operator+,参数类型不同即可。再写全局函数Person operator+(const Person& person, int number):新建对象,两个属性都加上这个整数后按值返回。
全局函数的本质调用是operator+(p, x),它可以简化成p + x。两种写法必须得到同一结果。
两个人相加必须用成员函数,人和整数相加必须用全局函数。不要同时提供「两个人相加」的成员版和全局版,否则同一组操作数会二义。加号必须做加法,不能改成相减或其他运算(那是滥用运算符重载)。内置整数的加号不能被改写,例如不能让 1+1 变成 \(0\)。
读入若干人员和若干次运算,按要求输出结果对象的两个属性。
输入格式
第一行两个整数 \(n\)、\(q\)(\(1 \le n,q \le 1000\)),表示人员数量和运算次数。
接下来 \(n\) 行,第 \(i\) 行两个整数 \(a_i\)、\(b_i\)(\(\lvert a_i\rvert,\lvert b_i\rvert \le 10^6\)),表示第 \(i\) 个人的 mA 和 mB。人员编号从 \(1\) 开始。
接下来 \(q\) 行,每行一种运算:
1 i j:用简化写法计算 \(p_i + p_j\)(\(1 \le i,j \le n\))2 i j:用成员函数本质写法 \(p_i.\mathrm{operator}+(p_j)\)3 i x:用简化写法计算 \(p_i + x\)(\(\lvert x\rvert \le 10^6\))4 i x:用全局函数本质写法 \(\mathrm{operator}+(p_i, x)\)
保证中间结果仍在 int 范围内。
输出格式
对每次运算输出一行两个整数:结果对象的 mA 和 mB,中间一个空格,行末换行。结果必须由重载后的 operator+ 算出。
样例
输入 #1
2 4
10 10
10 10
1 1 2
2 1 2
3 1 100
4 1 100
输出 #1
20 20
20 20
110 110
110 110
输入 #2
2 3
3 4
5 6
1 1 2
3 2 -1
2 2 1
输出 #2
8 10
4 5
8 10
说明
1与2都是两个人对应属性相加,只是一个走简化写法,一个走p1.operator+(p2)。3与4都是两个属性同时加上整数,只是一个走简化写法,一个走operator+(p, x)。- 样例 #1:两个人都是 \(10,10\),相加得到 \(20,20\);第一个人再加 \(100\) 得到 \(110,110\)。
- 内置类型的加号含义不能改;自定义类型的加号必须按题面做加法,不能写成减法。
信息
- ID
- 1120
- 难度
- (无)
- 分类
- (无)
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 通过率
- ?
- 上传者