运算符重载和自定义类型变换.ppt
《运算符重载和自定义类型变换.ppt》由会员分享,可在线阅读,更多相关《运算符重载和自定义类型变换.ppt(30页珍藏版)》请在三一办公上搜索。
1、运算符重载,运算符重载,运算符重载允许为运算指定用户定义的运算符实现,其中一个或两个操作数是用户定义的类或结构类型 所有一元和二元运算符都具有可自动用于任何表达式的预定义实现,可通过在类或结构中设置 operator 声明来引入用户定义的实现,其优先级总是高于预定义运算符实现重载运算符便于程序员编写同时含有ADT和原生基本类型的中缀表达式,使程序更短,结构更清晰,复数类的四则运算,定义一个复数类Complex,将其多个实例进行四则运算,如何编程实现?,static void Main()Complex c1=new Complex(1,2);Complex c2=new Complex(3.5
2、,-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
3、二元运算符+-*/%&|=!=,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 Co
4、mplex 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 Comp
5、lex(-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();,自动
6、调用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方法默认比较的是对象的相等性。当引用指向同一个对象的时候,它们是相等的,
7、具有相同状态但指向不同对象的引用是不相等的,可对其进行改写,比较其内容是否相同 对于值类型来说,Equals已经重写过以进行值的比较,GetHashCode,重载Equals必须重载GetHashCode这是一条编译器的rule。如果你重载了Equals不重载GetHashCode,编译器会发出警报GetHashCode需要返回一个Int32值,这个值的规律很简单:如果两个对象相同,则对象返回的HashCode必须相同。如果两个对象返回的HashCode不相同,则这两个对象必定不相同。两个对象不相同,不能保证hashCode不同这样就使得Equals的效率提高很多。因为GetHashCode通
8、常成本比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!=(Comple
9、x c1,Complex c2)return!c1.Equals(c2);public override int GetHashCode()return this.ToString().GetHashCode();,思考,如何实现复数的其他运算?加/减乘/除取反显示,自定义类型转换,现在,如果要实现int+Complex怎么办呢?还有,complex+intComplex+doubledouble+complexfloat+ComplexComplex+float。为每种运算定义重载太麻烦了,有更好的办法自定义类型转换,用户自定义变换,在不希望进行隐式类型变换或者表达式不合法时,有必要对表达式
10、进行用户自定义的类型变换。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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载 自定义 类型 变换
链接地址:https://www.31ppt.com/p-5459701.html