欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    运算符重载和自定义类型变换.ppt

    • 资源ID:5459701       资源大小:199.51KB        全文页数:30页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    运算符重载和自定义类型变换.ppt

    运算符重载,运算符重载,运算符重载允许为运算指定用户定义的运算符实现,其中一个或两个操作数是用户定义的类或结构类型 所有一元和二元运算符都具有可自动用于任何表达式的预定义实现,可通过在类或结构中设置 operator 声明来引入用户定义的实现,其优先级总是高于预定义运算符实现重载运算符便于程序员编写同时含有ADT和原生基本类型的中缀表达式,使程序更短,结构更清晰,复数类的四则运算,定义一个复数类Complex,将其多个实例进行四则运算,如何编程实现?,static void Main()Complex c1=new Complex(1,2);Complex c2=new Complex(3.5,-2);Complex c3=new Complex(-4,23);/result=c1+c2-c3如何得到?Complex result=c1.Add(c2).Sub(c3);/将Add、Sub改成静态方法会不会更好些?Complex result2=Complex.Sub(Complex.Add(c1,c2),c3);Console.WriteLine(result2.Print();Console.Read();,在实现了需要的功能后,有没有一种让用户用更习惯、可读性、可编程性更好的方法来进行类似的运算呢?解决方案:运算符重载!,可重载的运算符,一元运算符+-!+-true false二元运算符+-*/%&|=!=,public class Complex public int real;public int imaginary;public Complex()public Complex(int real,int imaginary)this.real=real;this.imaginary=imaginary;public static Complex operator+(Complex c1,Complex c2)return new Complex(c1.real+c2.real,c1.imaginary+c2.imaginary);public static Complex operator-(Complex c1,Complex c2)return new Complex(c1.real-c2.real,c1.imaginary-c2.imaginary);public override string ToString()return(String.Format(0+1i,real,imaginary);,二元运算符重载示例,注意函数原形!,public static void Main()Complex num1=new Complex(3,4);Complex num2=new Complex(3,4);Complex num3=new Complex(-3,4);Complex sum=num1.Add(num2);Complex result=num1+num2-num3;Console.WriteLine(First complex number:0,num1);Console.WriteLine(Second complex number:0,num2);Console.WriteLine(The sum of the two numbers:0,sum);Console.WriteLine(The result:0,result);Console.WriteLine(num1=num2);Console.Read();,自动调用num1的ToString(),默认=是比较两个对象的引用是否相同,public static bool operator=(Complex c1,Complex c2)if(c1.real=c2.real,对=重载一定要对!=也进行重载,否则编译器报错,重写Equals和GetHashCode方法,警告1:“ConsoleApplication3.Complex”定义运算符=或运算符!=,但不重写 Object.Equals(object o)和GetHashCode方法 对于引用类型来说,Object.Equals方法默认比较的是对象的相等性。当引用指向同一个对象的时候,它们是相等的,具有相同状态但指向不同对象的引用是不相等的,可对其进行改写,比较其内容是否相同 对于值类型来说,Equals已经重写过以进行值的比较,GetHashCode,重载Equals必须重载GetHashCode这是一条编译器的rule。如果你重载了Equals不重载GetHashCode,编译器会发出警报GetHashCode需要返回一个Int32值,这个值的规律很简单:如果两个对象相同,则对象返回的HashCode必须相同。如果两个对象返回的HashCode不相同,则这两个对象必定不相同。两个对象不相同,不能保证hashCode不同这样就使得Equals的效率提高很多。因为GetHashCode通常成本比Equals小得多。,public static bool operator=(Complex c1,Complex c2)if(c1.real=c2.real,整理一下,这样更好,public override bool Equals(object obj)if(!(obj is Complex)return false;return this=(Complex)obj;public static bool operator=(Complex c1,Complex c2)return c1.Equals(c2);public static bool operator!=(Complex c1,Complex c2)return!c1.Equals(c2);public override int GetHashCode()return this.ToString().GetHashCode();,思考,如何实现复数的其他运算?加/减乘/除取反显示,自定义类型转换,现在,如果要实现int+Complex怎么办呢?还有,complex+intComplex+doubledouble+complexfloat+ComplexComplex+float。为每种运算定义重载太麻烦了,有更好的办法自定义类型转换,用户自定义变换,在不希望进行隐式类型变换或者表达式不合法时,有必要对表达式进行用户自定义的类型变换。C#支持将用户自定义的ADT和内建的数据类型进行集成C#使用关键字implicit和explicit来修改单参数的静态方法,用户自定义的隐式变换,Implicit关键字 用于声明用户定义的隐式类型转换运算符,可通过消除不必要的类型转换来提高源代码的可读 class MyType public static implicit operator int(MyType m)/code to convert from MyType to int,MyType x;int i=x;/implicitly call MyTypes MyType-to-int conversion operator,用户自定义的显式变换,explicit 关键字 用于声明用户定义的显式类型转换运算符class MyType public static explicit operator MyType(int i)/code to convert from int to MyType,int i;MyType x=(MyType)i;/int-to-MyType requires cast,为Complex类添加自定义类型转换,Complex num1=new Complex(2,3);Complex num2=new Complex(3,4);Complex num3=4.5;Complex sum=num1+3+num2;Console.WriteLine(The sum of the 3 numbers:0,sum);,/从实数到复数的自定义隐式转换/复数的实部/public static implicit operator Complex(double r)return new Complex(r,0);,两次隐式转换:1)int-double2)double-Complex,implicit改成explicit将会如何?,显式自定义类型转换,public static explicit operator Complex(double r)return new Complex(r,0);public static void Main()Complex num1=new Complex(2,3);Complex num2=new Complex(3,4);Complex num3=(Complex)4.5;Complex sum=num1+(Complex)3+num2;Console.WriteLine(The sum of the 3 numbers:0,sum);,更多运算符重载的例子。,public class DoubOp public DoubOp(int i,int j)x=i;y=j;public static DoubOp operator+(DoubOp a)a.x+;a.y+;return a;public static DoubOp operator-(DoubOp a)a.x-;a.y-;return a;public void Print()Console.WriteLine(this.x+this.y);int x,y;,class Testpublic static void Main()DoubOp a=new DoubOp(10,29);a.Print();a+;a.Print();a-;a.Print();,一元运算符重载示例,书中重载示例:分数,class Fraction int numerator;int denominator;public Fraction(int numerator,int denominator)this.numerator=numerator;this.denominator=denominator;public static Fraction operator+(Fraction lhs,Fraction rhs)if(lhs.denominator=rhs.denominator)return new Fraction(lhs.numerator+rhs.numerator,lhs.denominator);else int firstProduct=lhs.numerator*rhs.denominator;int secondProduct=rhs.numerator*lhs.denominator;int newDenominator=lhs.denominator*rhs.denominator;return new Fraction(firstProduct+secondProduct,newDenominator).Simply();public override string ToString()return string.Format(0/1,this.numerator,this.denominator);,/对分数进行约简 public Fraction Simply()int num=Math.Abs(this.denominator);/从大到小查找分子分母的最大公约数 while(num 1)if(numerator%num=0,public static bool operator=(Fraction lhs,Fraction rhs)Fraction f1=lhs.Simply();Fraction f2=rhs.Simply();if(f1.numerator=f2.numerator/更好的做法:交叉相乘若想等就相同,进一步:怎么比较分数的大小,思路方法一:先进行通分,在分母相同的情况下,由分子比较来得到分数的大小方法二:将2个分数都转换成double,然后比较double值注意重载了必须同时重载=必须同时重载=,分数-double并比较,public static implicit operator double(Fraction f)return(double)(f.numerator)/f.denominator;public static bool operator(Fraction lhs,Fraction rhs)double l=lhs;double r=rhs;return l r;,/测试代码double r=f3+3;Console.WriteLine(0+3=1,f3,r);Console.WriteLine(0 is greater than 1 is 2,f1,f2,f1 f2);,编译器还会要求你添加的重载,更进一步问题,问题一:f23结果是什么?中间如何转换问题二:如何实现下列这些操作?double+Fraction-Fraction Fraction+double-Fraction,显式类型变换,/测试代码Fraction f5=(Fraction)3.5+f4;Console.WriteLine(3.5+0=1,f4,f5);,public static explicit operator Fraction(double d)Fraction f=new Fraction(int)(d*100),100).Simply();return f;,怎么判断应该用显式变换还是隐式变换?,更好的做法,这里其实double-Fraction是无损的,可implicitFraction-double是有损的,应为Explicit,运算符重载注意点,不能被重载的运算符:成员访问、方法调用或=、&、|、?:、checked、unchecked、new、typeof、as 和 is 运算符当重载一个二元运算符时,也会隐式重载相应的赋值运算符(若有)强制转换运算(如(T)x)通过提供用户定义的转换来重载。一元或二元运算符重载只能作为静态方法实现应尽可能保持运算符含义的一致性,重载方法的签名匹配,对方法调用和方法声明中的参数列表进行匹配,由编译器来完成签名匹配算法:如果能找到,使用精确匹配尝试标准类型提升尝试用户自定义转换,练习题,为复数类添加乘/除运算符重载定义一个三维空间坐标类,包含三个分量的值(x,y,z),如何对两个坐标点进行加、减运算,并根据这两个点到原点的距离大小来对这两个点进行大小比较定义一个角度类,能表示度、分、秒的信息,如100度30分29秒表示一个钝角,为其定义运算符重载,使得能对2个角度进行加、减运算,并能进行大小比较,

    注意事项

    本文(运算符重载和自定义类型变换.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开