小天:别总是光说不练好不好,来点实际的吧。我都习惯了从例题中学习,而不是看概念学习了。
老田:哎,下面就来开发一个结构Record,来演示运算符重载,第一个重载是复写了ToString方法。
using System;
namespace operator_overload { public struct Record //注意,这里是结构 { private int x, y; public Record(int num1, int num2) { x = num1; y = num2; } ///<summary> ///复写ToString方法,在界面上例题一 ///</summary> ///<returns></returns> public override string ToString() { string str=string.Format("[{0},{1}]", x, y); return str; //上面这两句按照如下形式写更节约,想下为什么 //return string.Format("[{0},{1}]", x, y); } } } |
接下来,使用这个方法,在Button_Click1事件中写如下代码
private void button1_Click(object sender, EventArgs e) { //创建两个Record对象 Record r1 = new Record(200, 300); Record r2 = new Record(30, 60); //看下这两个的显示情况 MessageBox.Show("r1=" + r1.ToString() + " , r2=" + r2.ToString() + ""); //上面这句显示结果为r1 = [200,300] , r2=[30,60] } |
小天:如何重载符号呢?我刚才试了几种都不行哦。我希望直接在代码中用r1加或者减r2,以得到值。
老田:如下,我们继续在Record结构中添加代码,以重载 + 和–号
///<summary> ///重载 + 运算符 ///</summary> ///<param name="r1">Record 对象 1</param> ///<param name="r2">Record 对象 2</param> ///<returns>已经执行运算后的新的 Record 对象</returns> public static Record operator +(Record r1, Record r2) { //用传入的参数r1和r2的x、y这两个字段分别相加,并实例成一个新的record对象返回出去 return new Record(r1.x + r2.x, r1.y + r2.y); } ///<summary> ///重载 - 运算符 ///</summary> ///<param name="r1">Record 对象 1</param> ///<param name="r2">Record 对象 2</param> ///<returns>已经执行运算后的新的 Record 对象</returns> public static Record operator -(Record r1, Record r2) { //用传入的参数r1和r2的x、y这两个字段分别相减,并实例成一个新的record对象返回出去 return new Record(r1.x - r2.x, r1.y - r2.y); } |
接下来,我们在示例窗体上再添加一个按钮,双击产生Button_Click2事件,并输入如下代码
private void button2_Click(object sender, EventArgs e) { //创建两个Record对象 Record r1 = new Record(200, 300); Record r2 = new Record(30, 60); //申明r3和r4分别等于r1和r2相加、减之后的新对象 Record r3 = r1 + r2; Record r4 = r1 - r2; MessageBox.Show("r3=" + r3.ToString() + " , r4=" + r4.ToString() + ""); //上面这句显示结果为r3 = [230,340] , r4=[170,240] } |
小天:上面的这段代码看起来并没有什么特色啊。
老田:是没有特色,不过你想下+、-号什么时候可以应用于对象的加减了呢?
小天:哦明白了,+、- 号通常只应用与预定义数值类型之间的运算,这里我们重载了之后居然可以对对象执行加减运算了。
对了,你上面说,+=和-=不能重载,但是只要+、-这两给被重载了,那么+=和-=也就同时拥有了新功能,这是真的吗?怎么来试用下看看?
老田:那多简单啊,在窗体上再增加一个按钮,双击在Button_Click3事件中编写如下代码
private void button3_Click(object sender, EventArgs e) { //-= Record r1 = new Record(200, 300); Record r2 = new Record(30, 60); r1-=r2; MessageBox.Show(r1.ToString()); //+= Record r3 = new Record(200, 300); Record r4 = new Record(30, 60); r3 += r4; MessageBox.Show(r3.ToString()); } |
老田:好吧,你练习吧,至少练习10个运算符哦,还有就是将前面所学的知识都融合起来。
本文章为天轰穿原创作品,转载请注明出处及作者。