任务描述
大学中各个社团有时候会联合举办活动,那么参加的人数将会是各个社团人数的总和。
任务要求:使用重载运算符+
,直接根据已定义好的社团类实例对象计算总人数。
相关知识
运算符的重载
我们已经学了使用运算符处理简单类型,当我们学习类概念之后,我们可运用运算符的重载处理类实例化的对象。
简单类型的运算符处理,例如:
namespace K3
{
public class Person {
int age;
public int updateAge() {
return age+1;
}
public void setAge(int _age) {
age = _age;
}
}
class myCaller {
public static void Main(string[] agrs) {
Person p1 = new Person();
Person p2 = new Person();
int pTemp1 = Convert.ToInt32(Console.ReadLine());
int pTemp2 = Convert.ToInt32(Console.ReadLine());
p1.setAge(pTemp1);
p2.setAge(pTemp2);
if (p1.updateAge() > p2.updateAge()){ //使用>操作符
//处理代码
}else {
//处理代码
}
}
}
}
我们从通过键盘读取几个数字作为变量p1
和p2
中age
属性的值,通过比较运算符>
的处理结果运行不同的处理代码。
若使用运算符的重载,将符号>
重载为能够处理类对象的操作符,便可隐式的提供对两个int
型变量的处理逻辑,直接使用对象进行比较,例如:
if (p1 > p2){ //使用>操作符
//处理代码
}else {
//处理代码
}
这种情况下,使用Person
类型直接进行比较。我们使用关键字operator
对运算符进行重定义,使用结构如下:
public static <返回值类型> operator <操作符>(<操作对象参数1>,<操作对象参数2>...){
//逻辑处理
//...
return <返回值>
}
其中运算符需要用静态修饰符static
限定;返回值类型与实际操作符有关;操作数对象作为传参,传参数目与操作符相关,例如+
操作符为二元操作符,那么参数需要两个操作对象。下面我们对符号<
进行重载:
public static bool operator <(Person p1, Person p2){
if(p1.updateAge() < p2.updateAge()){
return true;
}else{
return false;
}
}
此段代码中,由于<
操作符为二元操作符,且操作结果为bool
类型,所以参数数目为两个,且返回值为bool
类型。
我们将原来那段代码补全如下:
namespace K3
{
public class Person {
int age;
public int updateAge() {
return age+1;
}
public void setAge(int _age) {
age = _age;
}
//重载操作符>
public static bool operator >(Person p1, Person p2)
{
if (p1.updateAge() > p2.updateAge()){
return true;
}
else{
return false;
}
}
//重载操作符<
public static bool operator <(Person p1, Person p2){
if (p1.updateAge() < p2.updateAge()){
return true;
}
else{
return false;
}
}
}
//调用类myCaller
class myCaller {
public static void Main(string[] agrs) {
Person p1 = new Person();
Person p2 = new Person();
int pTemp1 = Convert.ToInt32(Console.ReadLine());
int pTemp2 = Convert.ToInt32(Console.ReadLine());
p1.setAge(pTemp1);
p2.setAge(pTemp2);
if (p1 > p2){ //重载过后,直接使用对象进行处理
//处理代码
Console.WriteLine("the return value is true");
}else {
//处理代码
Console.WriteLine("the return value is false");
}
}
}
补全完整后,我们将操作符>
也进行了重载。需要注意,符号>
和符号<
须保持一致,不能够一个重载,而另一个没有重载:
//重载操作符>
public static bool operator >(Person p1, Person p2)
{
if (p1.updateAge() > p2.updateAge()){
return true;
}
else{
return false;
}
}
重载之后使用类Person
对象实例直接进行比较操作:
if (p1 > p2){ //重载过后,直接使用对象进行处理
//处理代码
Console.WriteLine("the return value is true");
}else {
//处理代码
Console.WriteLine("the return value is false");
}
运行结果如下:
运算符重载表
并非所有运算符都可通过operator
关键字定义重载,如下表所示:
图中的比较运算符,必须成对的进行重载,如我们已接触到的<
、>
;再比如==
进行重载,那么!=
也必须重载。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
Community
,重载操作符+
,使之能够在Community
实例对象之间进行运算;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace K3
{
public class Community
{
private int number; //人数
public Community(int number)
{
this.number = number;
}
/********** Begin *********/
//重载+运算符
public static int operator +(Community a, Community b)
{
return a.number+b.number;
}
/********** End *********/
}
public class myCaller
{
public static void Main(string[] args)
{
Community violin = new Community(50); //小提琴社
Community cello = new Community(27); //大提琴社
int total = violin + cello;
Console.WriteLine("The number of participants in this event is:" + total);
}
}
}