Presentation is loading. Please wait.

Presentation is loading. Please wait.

1 運算子多載 鄭士康國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所.

Similar presentations


Presentation on theme: "1 運算子多載 鄭士康國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所."— Presentation transcript:

1 1 運算子多載 鄭士康國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所

2 2 運算子多載 可以多載 可以多載 – 一元: + 、 - 、 ! 、 ~ 、 ++ 、 -- 、 true 、 false – 二元: + 、 - 、 * 、 / 、 % 、 & 、 | 、 ^ 、 > 、 == 、 != 、 > 、 = 、 > 、 == 、 != 、 > 、 = 、 <= 不可多載 不可多載 –= 、. 、 && 、 || 、 ?: 、 [] 、 () 、 -> 、 new 、 is 、 sizeof 、 typeof 、 += 、 -= 、 *= 、 /= 、 %= 、 &= 、 |= 、 ^= 、 >= 轉換運算子 轉換運算子 –explicit 關鍵字 –Implicit 關鍵字

3 3 UsingOperOverload.Program(1/2) using System; namespace UsingOperOverload { /* 示範一元運算子多載 /* 示範一元運算子多載 * 4/9/2007 * 4/9/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { Rectangle rec = new Rectangle(100, 50); Rectangle rec = new Rectangle(100, 50); Console.WriteLine(" 長方形 rec 的面積 : " + Console.WriteLine(" 長方形 rec 的面積 : " + rec.Area()); rec.Area());

4 4 UsingOperOverload.Program(2/2) rec++; Console.WriteLine(" 長方形 rec++ 後的面積 : " + Console.WriteLine(" 長方形 rec++ 後的面積 : " + rec.Area()); // 應為 5151 rec.Area()); // 應為 5151 ++rec; ++rec; Console.WriteLine(" 長方形 ++rec 後的面積 : " + Console.WriteLine(" 長方形 ++rec 後的面積 : " + rec.Area()); // 應為 5304 rec.Area()); // 應為 5304 Console.ReadLine(); Console.ReadLine(); } }}

5 5 UsingOperOverload.Rectangle(1/2) using System; namespace UsingOperOverload { public class Rectangle public class Rectangle { private int width; private int width; private int length; private int length; private int area; private int area; public Rectangle(int width, int length) public Rectangle(int width, int length) { this.width = width; this.width = width; this.length = length; this.length = length; area = width * length; area = width * length; }

6 6 UsingOperOverload.Rectangle(2/2) public int Area() public int Area() { return area; return area; } public static Rectangle operator ++(Rectangle op) public static Rectangle operator ++(Rectangle op) { Rectangle result = new Rectangle(op.width+1, Rectangle result = new Rectangle(op.width+1, op.length+1); op.length+1); return result; return result; } }}

7 7 UsingOperOverload2.Program(1/2) using System; namespace UsingOperOverload2 { /* /* * 示範二元運算子多載的應用 * 示範二元運算子多載的應用 * 4/9/2007 * 4/9/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { Rectangle rec1 = new Rectangle(100, 50); Rectangle rec1 = new Rectangle(100, 50); Rectangle rec2 = new Rectangle(90, 25); Rectangle rec2 = new Rectangle(90, 25); Rectangle recSum = rec1 + rec2; Rectangle recSum = rec1 + rec2; Rectangle recDif = rec1 - rec2; Rectangle recDif = rec1 - rec2;

8 8 UsingOperOverload2.Program(2/2) // recSum.Area() 應為 14250 // recSum.Area() 應為 14250 Console.WriteLine("rec1 + rec2 的面積 : " + Console.WriteLine("rec1 + rec2 的面積 : " + recSum.Area()); recSum.Area()); // recDif.Area() 應為 250 // recDif.Area() 應為 250 Console.WriteLine("rec1 - rec2 的面積 : " + Console.WriteLine("rec1 - rec2 的面積 : " + recDif.Area()); recDif.Area()); Console.ReadLine(); Console.ReadLine(); } }}

9 9 練習 撰寫測試主程式及類別 Rational ( 有理數 ) , 其中須測試及定義有理數 + 、 - 、 * 、 / 、 ++ 運算子。可不必考慮約分。 撰寫測試主程式及類別 Rational ( 有理數 ) , 其中須測試及定義有理數 + 、 - 、 * 、 / 、 ++ 運算子。可不必考慮約分。

10 10 UsingOperOverload3.Program(1/2) using System; namespace UsingOperOverload3 { /* /* * 示範不同型別運算元之二元運算子多載 * 示範不同型別運算元之二元運算子多載 * 4/9/2007 * 4/9/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { StudentClass cls = new StudentClass(20); StudentClass cls = new StudentClass(20); StudentClass clsAfterAdd = cls + 10; StudentClass clsAfterAdd = cls + 10; StudentClass clsAfterSub = cls - 3; StudentClass clsAfterSub = cls - 3; Console.WriteLine(" 加選後班級人數 : " + Console.WriteLine(" 加選後班級人數 : " + clsAfterAdd.accessNStudents); clsAfterAdd.accessNStudents);

11 11 UsingOperOverload3.Program(2/2) Console.WriteLine(" 退選後班級人數 : " + clsAfterSub.accessNStudents); clsAfterSub.accessNStudents); Console.ReadLine(); Console.ReadLine(); } }}

12 12 UsingOperOverload3.StudentClass (1/3) using System; namespace UsingOperOverload3 { public class StudentClass public class StudentClass { private int nStudents; private int nStudents; public StudentClass(int nStudents) public StudentClass(int nStudents) { if (nStudents < 0) if (nStudents < 0) { this.nStudents = 0; this.nStudents = 0; } else else { this.nStudents = nStudents; this.nStudents = nStudents; } }

13 13 UsingOperOverload3.StudentClass (2/3) public int accessNStudents public int accessNStudents { get get { return nStudents; return nStudents; } } public static StudentClass operator public static StudentClass operator +(StudentClass op1, int op2) +(StudentClass op1, int op2) { StudentClass result = new StudentClass result = new StudentClass(op1.nStudents + op2); StudentClass(op1.nStudents + op2); return result; return result; }

14 14 UsingOperOverload3.StudentClass (3/3) public static StudentClass operator – public static StudentClass operator – (StudentClass op1, int op2) (StudentClass op1, int op2) { StudentClass result = new StudentClass result = new StudentClass(op1.nStudents - op2); StudentClass(op1.nStudents - op2); return result; return result; } }}

15 15 LogOperOverload.Program(1/2) using System; namespace LogOperOverload { /* /* * 示範邏輯運算子之多載 * 示範邏輯運算子之多載 * 4/10/2007 * 4/10/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { StudentClass clsA = new StudentClass(30); StudentClass clsA = new StudentClass(30); StudentClass clsB = new StudentClass(40); StudentClass clsB = new StudentClass(40); StudentClass clsC = new StudentClass(0); StudentClass clsC = new StudentClass(0); bool canMerge = clsA & clsB; bool canMerge = clsA & clsB;

16 16 LogOperOverload.Program(2/2) string message = canMerge ? "A 班與 B 班可合併 " : string message = canMerge ? "A 班與 B 班可合併 " : "A 班與 B 班不可合併 "; "A 班與 B 班不可合併 "; Console.WriteLine(message); Console.WriteLine(message); bool canNotCancel = !clsC; bool canNotCancel = !clsC; message = canNotCancel ? "C 班不可裁撤 " : message = canNotCancel ? "C 班不可裁撤 " : "C 班可裁撤 "; "C 班可裁撤 "; Console.WriteLine(message); Console.WriteLine(message); Console.ReadLine(); Console.ReadLine(); } }}

17 17 LogOperOverload.StudentClass(1/3) using System; namespace LogOperOverload { public class StudentClass public class StudentClass { private int nStudents; private int nStudents; public StudentClass(int nStudents) public StudentClass(int nStudents) { if (nStudents < 0) if (nStudents < 0) { this.nStudents = 0; this.nStudents = 0; } else else { this.nStudents = nStudents; this.nStudents = nStudents; } }

18 18 LogOperOverload.StudentClass(2/3) public int accessNStudents public int accessNStudents { get get { return nStudents; return nStudents; } } public static bool operator &(StudentClass op1, public static bool operator &(StudentClass op1, StudentClass op2) StudentClass op2) { bool result = op1.nStudents+op2.nStudents < 50; bool result = op1.nStudents+op2.nStudents < 50; return result; return result; }

19 19 LogOperOverload.StudentClass(3/3) public static bool operator !(StudentClass op) public static bool operator !(StudentClass op) { bool result = op.nStudents > 0; bool result = op.nStudents > 0; return result; return result; } }}

20 20 RelOperOverload.Program(1/2) using System; namespace RelOperOverload { /* /* * 示範關聯運算子 > 和 和 < 的多載 * 4/11/2007 * 4/11/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { StudentClass clsA = new StudentClass(20); StudentClass clsA = new StudentClass(20); StudentClass clsB = new StudentClass(30); StudentClass clsB = new StudentClass(30); bool clsAIsLarger = clsA > clsB; bool clsAIsLarger = clsA > clsB; string message = clsAIsLarger ? string message = clsAIsLarger ? "A 班人數大於 B 班 " : "A 班人數不大於 B 班 "; "A 班人數大於 B 班 " : "A 班人數不大於 B 班 ";

21 21 RelOperOverload.Program(2/2) Console.WriteLine(message); Console.ReadLine(); Console.ReadLine(); } }}

22 22 RelOperOverload.StudentClass(1/3) using System; namespace RelOperOverload { public class StudentClass public class StudentClass { private int nStudents; private int nStudents; public StudentClass(int nStudents) public StudentClass(int nStudents) { if (nStudents < 0) if (nStudents < 0) { this.nStudents = 0; this.nStudents = 0; } else else { this.nStudents = nStudents; this.nStudents = nStudents; } }

23 23 RelOperOverload.StudentClass(2/3) public int accessNStudents public int accessNStudents { get get { return nStudents; return nStudents; } } public static bool operator >(StudentClass op1, public static bool operator >(StudentClass op1, StudentClass op2) StudentClass op2) { bool result = (op1.nStudents > op2.nStudents); bool result = (op1.nStudents > op2.nStudents); return result; return result; }

24 24 RelOperOverload.StudentClass(3/3) public static bool operator <(StudentClass op1, public static bool operator <(StudentClass op1, StudentClass op2) StudentClass op2) { bool result = (op1.nStudents < op2.nStudents); bool result = (op1.nStudents < op2.nStudents); return result; return result; } }}

25 25 練習 在類別 Rational ( 有理數 ) 中添加有理數 > 、 、 < 、 ! ( 檢驗是否為 0) 運算子,並予測試。 處理 Rational ( 有理數 ) 類別與整數進行 + 、 - 、 * 、 / 的情形 處理 Rational ( 有理數 ) 類別與整數進行 + 、 - 、 * 、 / 的情形

26 26 RelOperOverload.Program(1/2) using System; namespace RelOperOverload2 { /* /* * 示範關聯運算子 ==,!=,Equals,GetHashCode 等的多載 * 示範關聯運算子 ==,!=,Equals,GetHashCode 等的多載 * 4/11/2007 * 4/11/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { StudentClass clsA = new StudentClass("A", 20); StudentClass clsA = new StudentClass("A", 20); StudentClass clsB = new StudentClass("B", 20); StudentClass clsB = new StudentClass("B", 20); bool clsAEqualsclsB = clsA == clsB; bool clsAEqualsclsB = clsA == clsB; string message = clsAEqualsclsB ? string message = clsAEqualsclsB ? “clsA 與 clsB 相等 ”: “clsA 與 clsB 不等 "; “clsA 與 clsB 相等 ”: “clsA 與 clsB 不等 ";

27 27 RelOperOverload.Program(2/2) Console.WriteLine(message); clsAEqualsclsB = clsA.Equals(clsB); clsAEqualsclsB = clsA.Equals(clsB); message = clsAEqualsclsB ? “clsA 與 clsB 相等 ": message = clsAEqualsclsB ? “clsA 與 clsB 相等 ": “clsA 與 clsB 不等 "; “clsA 與 clsB 不等 "; Console.WriteLine(message); Console.WriteLine(message); Console.ReadLine(); Console.ReadLine(); } }}

28 28 RelOperOverload2.StudentClass(1/3) using System; namespace RelOperOverload2 { public class StudentClass public class StudentClass { private int nStudents; private int nStudents; private string name; private string name; public StudentClass(string name, int nStudents) public StudentClass(string name, int nStudents) { this.name = name; this.name = name; if (nStudents < 0) if (nStudents < 0) { this.nStudents = 0; this.nStudents = 0; }

29 29 RelOperOverload2.StudentClass(2/3) else else { this.nStudents = nStudents; this.nStudents = nStudents; } } public static bool operator ==(StudentClass op1, public static bool operator ==(StudentClass op1, StudentClass op2) { bool result = ( op1.name.Equals(op2.name) ) && bool result = ( op1.name.Equals(op2.name) ) && (op1.nStudents == op2.nStudents); (op1.nStudents == op2.nStudents); return result; return result; } public static bool operator !=(StudentClass op1, public static bool operator !=(StudentClass op1, StudentClass op2) { return !(op1 == op2); return !(op1 == op2); }

30 30 RelOperOverload2.StudentClass(3/3) public override bool Equals(object obj) public override bool Equals(object obj) { bool result = false; bool result = false; if (obj is StudentClass) { if (obj is StudentClass) { StudentClass op = (StudentClass) obj; StudentClass op = (StudentClass) obj; result = name.Equals(op.name) && result = name.Equals(op.name) && (nStudents == op.nStudents); (nStudents == op.nStudents); } return result; return result; } public override int GetHashCode() { public override int GetHashCode() { return nStudents.GetHashCode() + return nStudents.GetHashCode() + name.GetHashCode(); name.GetHashCode(); } }}

31 31 ConverOper.Program (1/2) using System; namespace ConverOper { /* /* * 示範 explicit 與 implicit 的轉換 * 示範 explicit 與 implicit 的轉換 * 4/11/2007 * 4/11/2007 */ */ class Program class Program { static void Main(string[] args) static void Main(string[] args) { Rectangle rec = new Rectangle(15, 10); Rectangle rec = new Rectangle(15, 10); int area = (int) rec; int area = (int) rec; Console.WriteLine("rec 面積為 " + area); Square sq = new Square(20); Square sq = new Square(20);

32 32 ConverOper.Program (2/2) rec = sq; rec = sq; area = (int)rec; area = (int)rec; Console.WriteLine("sq 面積為 " + area); Console.ReadLine(); Console.ReadLine(); } }}

33 33 ConverOper.Rectangle (1/2) using System; namespace ConverOper { public class Rectangle public class Rectangle { int width; int width; int length; int length; int area; int area; public Rectangle(int width, int length) public Rectangle(int width, int length) { this.width = width; this.width = width; this.length = length; this.length = length; area = length * width; area = length * width; }

34 34 ConverOper.Rectangle (2/2) public static explicit operator int(Rectangle op) public static explicit operator int(Rectangle op) { return op.area; return op.area; } }}

35 35 ConverOper.Square using System; namespace ConverOper { public class Square { public class Square { private int width; private int width; public Square(int width) { public Square(int width) { this.width = width; this.width = width; } public static implicit operator public static implicit operator Rectangle( Square op ) { Rectangle( Square op ) { Rectangle rec = new Rectangle( op.width, Rectangle rec = new Rectangle( op.width, op.width ); op.width ); return rec; return rec; } }}

36 36 練習 在類別 Rational ( 有理數 ) 中添加有理數 == 、 != 運算子及 Equals 、 GetHashCode 方法,並予測試。 在類別 Rational ( 有理數 ) 中添加有理數 == 、 != 運算子及 Equals 、 GetHashCode 方法,並予測試。 在類別 Rational ( 有理數 ) 中添加轉為 double 的 explicit 運算子,及 int 轉為 Rational 的 implicit 運算子 在類別 Rational ( 有理數 ) 中添加轉為 double 的 explicit 運算子,及 int 轉為 Rational 的 implicit 運算子


Download ppt "1 運算子多載 鄭士康國立台灣大學 電機工程學系 / 電信工程研究所 / 資訊網路與多媒體研究所."

Similar presentations


Ads by Google