运算符重载和自定义类型变换幻灯片.ppt
《运算符重载和自定义类型变换幻灯片.ppt》由会员分享,可在线阅读,更多相关《运算符重载和自定义类型变换幻灯片.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、运算符重载和自定义运算符重载和自定义类型变换类型变换第1页,共29页,编辑于2022年,星期三方法重载概述方法重载概述n n面向对象程序设计的一个重要特征,是一种面向对象程序设计的一个重要特征,是一种临时多态临时多态性性n n重载决策是一种编译时机制,用于在给定了参数列表和重载决策是一种编译时机制,用于在给定了参数列表和一组候选函数成员的情况下,由编译器选择一个最佳函一组候选函数成员的情况下,由编译器选择一个最佳函数成员来实施调用。数成员来实施调用。n n使得多个具有相同功能但参数不同的方法共享同一个方使得多个具有相同功能但参数不同的方法共享同一个方法名,降低程序员的工作强度,提高程序的可读性
2、法名,降低程序员的工作强度,提高程序的可读性n n例:例:double Add(double,double);double Add(double,double);int Add(int,int);int Add(int,int);第2页,共29页,编辑于2022年,星期三方法重载方法重载n n重载方法有两种方式n n指定不同个数的参数指定不同个数的参数指定不同个数的参数指定不同个数的参数n n指定不同类型的参数指定不同类型的参数指定不同类型的参数指定不同类型的参数n n重载的“两必须一可以”n n方法名必须相同方法名必须相同n n参数列表必须不同参数列表必须不同n n返回值可以不同返回值可以不
3、同第3页,共29页,编辑于2022年,星期三重载方法的调用重载方法的调用签名匹配签名匹配n n对方法调用和方法声明中的参数列表进行匹配,由编译器来完成n n签名匹配算法:1.1.如果能找到,使用精确匹配2.2.尝试标准类型提升3.3.尝试用户自定义转换第4页,共29页,编辑于2022年,星期三运算符重载运算符重载n n运算符重载允许为运算指定用户定义的运算符实现,其中一个或两个操作数是用户定义的类或结构类型 n n所有一元和二元运算符都具有可自动用于任何表达式的预定义实现,可通过在类或结构中设置 operator 声明来引入用户定义的实现,其优先级总是高于预定义运算符实现n n重载运算符便于程
4、序员编写同时含有ADT和原生基本类型的中缀表达式,使程序更短,结构更清晰第5页,共29页,编辑于2022年,星期三复数类的四则运算复数类的四则运算n n定义一个复数类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改成静态方法会不会更好些?Compl
5、ex result2=Complex.Sub(Complex.Add(c1,c2),c3);Console.WriteLine(result2.Print();Console.Read();第6页,共29页,编辑于2022年,星期三在实现了需要的功能后,有没有一种让用户用更习惯、可读性、可编程性更好的方法来进行类似的运算呢?解决方案:运算符重载!第7页,共29页,编辑于2022年,星期三可重载的运算符可重载的运算符n n一元运算符+-!+-true falsen n二元运算符+-*/%&|=!=第8页,共29页,编辑于2022年,星期三 public class Complex public
6、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
7、 new Complex(c1.real-c2.real,c1.imaginary-c2.imaginary);public override string ToString()return(String.Format(0+1i,real,imaginary);二二二二元元元元运运运运算算算算符符符符重重重重载载载载示示示示例例例例注意函数原形!注意函数原形!第9页,共29页,编辑于2022年,星期三 public static void Main()Complex num1=new Complex(3,4);Complex num2=new Complex(3,4);Complex num3
8、=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.R
9、ead();自动调用自动调用num1num1的的ToStringToString()()第10页,共29页,编辑于2022年,星期三 public static bool operator=(Complex c1,Complex c2)if(c1.real=c2.real&c1.imaginary=c2.imaginary)return true;else return false;public static bool operator!=(Complex c1,Complex c2)if(c1.real=c2.real&c1.imaginary=c2.imaginary)return fal
10、se;else return true;对对=重载一定要重载一定要对对!=!=也进行重载,也进行重载,否则编译器报错否则编译器报错第11页,共29页,编辑于2022年,星期三重写重写Equals和和GetHashCode方法方法n n警告警告1 1:“ConsoleApplication3.Complex”ConsoleApplication3.Complex”定义运算定义运算符符 =或运算符或运算符 !=!=,但不重写,但不重写 Object.Equals(object o)Object.Equals(object o)和和GetHashCodeGetHashCode方法方法 n n对于引用
11、类型来说,对于引用类型来说,Object.EqualsObject.Equals方法比较的是对象方法比较的是对象的相等性。当引用指向同一个对象的时候,它们是相等的,的相等性。当引用指向同一个对象的时候,它们是相等的,具有相同状态但指向不同对象的引用是不相等的具有相同状态但指向不同对象的引用是不相等的 n n对于值类型来说,对于值类型来说,EqualsEquals已经重写过以进行值的比较已经重写过以进行值的比较 第12页,共29页,编辑于2022年,星期三GetHashCoden n重载重载EqualsEquals必须重载必须重载GetHashCodeGetHashCoden n这是一条编译器的
12、这是一条编译器的rulerule。如果你重载了。如果你重载了EqualsEquals不重载不重载GetHashCodeGetHashCode,编译器会发出警报,编译器会发出警报n nGetHashCodeGetHashCode需要返回一个需要返回一个Int32Int32值,这个值得规律很简单:值,这个值得规律很简单:n n如果两个对象相同,则对象返回的如果两个对象相同,则对象返回的HashCodeHashCode必须相同。必须相同。n n如果两个对象返回的如果两个对象返回的HashCodeHashCode不相同,则这两个对象必定不不相同,则这两个对象必定不相同。相同。n n两个对象不相同,不能
13、保证两个对象不相同,不能保证hashCodehashCode不同?不同?n n这样就使得这样就使得EqualsEquals的效率提高很多。因为的效率提高很多。因为GetHashCodeGetHashCode通常成本比通常成本比EqualsEquals小得多。小得多。第13页,共29页,编辑于2022年,星期三 public static bool operator=(Complex c1,Complex c2)if(c1.real=c2.real&c1.imaginary=c2.imaginary)return true;else return false;public static bool
14、 operator!=(Complex c1,Complex c2)if(c1.real=c2.real&c1.imaginary=c2.imaginary)return false;else return true;public override bool Equals(object obj)Complex temp=obj as Complex;if(this=temp)return true;return false;public override int GetHashCode()/返回返回当前对象的哈希代码当前对象的哈希代码,不唯一!return this.ToString().Ge
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载 自定义 类型 变换 幻灯片
限制150内