HM121 两个人怎么相加

HM121 两个人怎么相加

HM121 两个人怎么相加

来源: 第 121 集 类和对象-C++运算符重载-加号运算符重载

难度: 入门

时间限制: 1s

空间限制: 64MB

题目描述

加号对内置整数有确定含义:编译器知道 \(1+1=2\)。两个自定义类型的对象相加时,编译器不知道该把哪些字段加到一起,因而没有与这些操作数匹配的加号运算符。要让自定义类型也能写 p3 = p1 + p2,必须给加号重新定义,这就是运算符重载。

请定义人员类型 Person,每人有两个整数属性 mAmB。相加规则如下:

  1. 两个人相加(成员函数重载)

    实现成员函数 Person operator+(const Person& other):新建一个临时对象,把它的 mA 设为 this->mA + other.mAmB 设为 this->mB + other.mB,再按值返回这个新对象。

    成员函数的本质调用是 p1.operator+(p2),它可以简化成 p1 + p2。两种写法必须得到同一结果。

  2. 人和整数相加(全局函数重载)

    运算符重载也可以发生函数重载:同一函数名 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\) 个人的 mAmB。人员编号从 \(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 范围内。

输出格式

对每次运算输出一行两个整数:结果对象的 mAmB,中间一个空格,行末换行。结果必须由重载后的 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

说明

  • 12 都是两个人对应属性相加,只是一个走简化写法,一个走 p1.operator+(p2)
  • 34 都是两个属性同时加上整数,只是一个走简化写法,一个走 operator+(p, x)
  • 样例 #1:两个人都是 \(10,10\),相加得到 \(20,20\);第一个人再加 \(100\) 得到 \(110,110\)。
  • 内置类型的加号含义不能改;自定义类型的加号必须按题面做加法,不能写成减法。

信息

ID
1120
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者