博客园  :: 首页  :: 新随笔  :: 订阅 订阅  :: 管理

小天:别总是光说不练好不好,来点实际的吧。我都习惯了从例题中学习,而不是看概念学习了。

老田:哎,下面就来开发一个结构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)

        {

            //用传入的参数r1r2xy这两个字段分别相加,并实例成一个新的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)

        {

            //用传入的参数r1r2xy这两个字段分别相减,并实例成一个新的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);

            //申明r3r4分别等于r1r2相加、减之后的新对象

            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个运算符哦,还有就是将前面所学的知识都融合起来。

本文章为天轰穿原创作品,转载请注明出处及作者。