Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
230,68 KB
Nội dung
CHƯƠNG ð NH NGHĨA CH NG TOÁN T ð nh nghĩa ch ng (overloading) m t kh m nh C++ cho phép xây d ng toán t c n thi t l p, giúp cho chương trình đư c vi t ng n g n rõ ràng Trong C++ có th đ nh nghĩa ch ng h u h t tốn t Các tốn t có th ñư c ñ nh nghĩa ch ng m t hàm thành ph n (phương th c) c a l p ho c m t hàm b n c a l p Chương s trình bày v cách ñ nh nghĩa ch ng s d ng hàm tốn t C++ § VÍ D TRÊN L P S PH C 1.1 Xây d ng hàm b n c ng hai s ph c Xét m t l p s ph c (SP) xây d ng m t hàm b n ñ c ng hai s ph c sau: class SP { double a, b; // Ph n th c, ph n o public: friend SP cong(SP u1, SP u2) { SP u; u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; } }; void main() { SP u, u1, u2; u = cong(u1, u2); // u t ng u1+u2 } 1.2 Xây d ng hàm toán t c ng hai s ph c Trong ví d v l p SP trên, ñã xây d ng hàm c ng hai s ph c b ng cách s d ng hàm b n Tuy v y, trư ng h p này, có th khơng c n s d ng hàm b n ch làm vi c v i m t l p 90 Ví d sau có m c đích (c ng hai s ph c) xây d ng hàm cong m t phương th c c a l p SP: class SP { double a, b; // Ph n th c, ph n o public: SP cong(SP u2); }; SP SP::cong(SP u2) { SP u; u.a= a+u2.a; u.b= b+u2.b; return u; } void main() { SP u, v, u1, u2, u3, u4; u= u1.cong(u2); // u t ng u1+u2 v= u1.cong(u2.cong(u3.cong(u4))); // v t ng u1+u2+u3+u4 } Nh n xét: V i c hai cách (dùng hàm b n dùng phương th c c a l p), bi u th c s ph c t p n u có nhi u phép tốn s ph c (như tính v ví d trên) C++ cho ta m t cơng c đ gi i quy t v n đ này: kh đ nh nghĩa ch ng toán t Các toán t sau ñư c ñ nh nghĩa ch ng cho l p có th s d ng v i đ i tư ng c a l p theo cách tương t v i bi n thu c ki u d li u chu n Ví d : class SP { double a, b; public: SP operator+(SP u2); 91 }; SP SP::operator+(SP u2) { SP u; u.a= a+u2.a; u.b= b+u2.b; return u; } void main() { SP u, v, u1, u2, u3, u4; u= u1+u2; // u t ng u1+u2 v= u1+u2+u3+u4; // v t ng u1+u2+u3+u4 } Nh n xét: Toán t c ng ‘+’ đóng vai trị hàm cong ví d trên, th c ch t chương trình d ch hi u m t hàm Nói cách khác ch th u= u1+u2 trư ng h p ñư c hi u u= u1.operator+(u2) Nhưng rõ ràng cách s d ng toán t làm cho bi u th c t nhiên ng n g n nhi u § GI I H N C A ð NH NGHĨA CH NG TOÁN T 2.1 Các tốn t có th đ nh nghĩa ch ng Ph n l n tốn t C++ đ u có th đ nh nghĩa ch ng, ngo i tr toán t truy nh p vào thành ph n ‘.’, tốn t xác đ nh ph m vi ‘::’, tốn t u ki n ‘?:’ toán t sizeof Chú ý r ng c m t “ñ nh nghĩa ch ng” ñã ph n ánh rõ: khơng th t o tốn t m i mà ch ñ nh nghĩa l i tốn t có đ có th làm vi c v i nh ng ki u d li u khác v i thi t k chu n c a 2.2 Các nguyên t c ñ nh nghĩa ch ng tốn t Các tốn t đ nh nghĩa ch ng ph i b o tồn s ngơi c a tốn t (theo cách hi u thơng thư ng), ví d có th đ nh nghĩa tốn t ‘-‘ m t ngơi (đ o d u) hai ngơi khơng th đ nh nghĩa tốn t gán ‘=’ m t ngơi Các tốn t đ nh nghĩa ch ng nên b o toàn ý nghĩa nguyên th y c a nó, ví d ta có th ñ nh nghĩa ch ng toán t ‘-‘ ñ th c hi n phép c ng (hai ñ i tư ng), u rõ ràng khơng có ích l i mà d gây nh m l n Các hàm tốn t có th đư c đ nh nghĩa hàm thành ph n c a l p ho c m t hàm b n: 92 + Trong trư ng h p hàm toán t hàm thành ph n c a l p (phương th c): hàm có m t đ i (tham s ) ng m ñ nh (xác ñ nh đ i tư ng g i hàm), v y v i tốn t m t ngơi hàm tốn t khơng ch a đ i nào, cịn v i tốn t hai ngơi hàm tốn t có m t đ i + Trong trư ng h p hàm toán t hàm b n: toán t ngơi hàm c n có b y nhiêu đ i Chú ý: Vì tốn t ph i thao tác d li u c a ñ i tư ng mà d li u thư ng thành ph n riêng nên hàm tốn t khơng th m t hàm t V y đ nh nghĩa (hàm tốn t ) hàm thành ph n, hàm b n? Nguyên t c chung là: n u tốn t ch làm vi c v i đ i tư ng c a m t l p đ nh nghĩa hàm thành ph n hay hàm b n ñ u ñư c, n u tốn t làm vi c v i đ i tư ng thu c nhi u l p khác b t bu c ph i hàm b n M t s trư ng h p c th c n lưu ý: + Các toán t = , [] ph i ñư c ñ nh nghĩa hàm thành ph n c a l p + Các tốn t > ph i đư c đ nh nghĩa hàm b n + Các toán t ++ , có th đư c s d ng theo hai cách khác (ti n t h u t ), u địi h i hai hàm toán t khác Trong th c t thư ng hay đ nh nghĩa hàm tốn t phương th c c a l p, th s đ c p chi ti t § Cách đ nh nghĩa ch ng m t s tốn t quan tr ng đư c trình bày § § PHƯƠNG TH C TOÁN T 3.1 Cách xây d ng phương th c tốn t Các phương th c tốn t đư c xây d ng phương th c thông thư ng, ch có khác cách đ t tên Tên c a phương th c toán t (cũng gi ng hàm tốn t ) đư c t o b ng cách ghép t khoá operator v i m t phép tốn (tốn t ) Chúng ta ch có th s d ng phép tốn đư c đ nh nghĩa C++ ñ ñ nh nghĩa phương th c cho m t l p m i, nên ñư c g i ñ nh nghĩa ch ng tốn t (operator overloading) Ví d : operator+ operator> Cũng gi ng phương th c thông thư ng, phương th c tốn t có đ i đ u tiên (đ i khơng tư ng minh) tr this 3.2 Toán t m t toán h ng Các phương th c toán t m t toán h ng (m t ngơi) dùng tr this đ bi u th toán h ng nh t này, nên phương th c s khơng có đ i tư ng minh Ví d phương th c tốn t ‘-‘ ñ ñ i d u m t ñ i tư ng ki u SP (s ph c) có th vi t sau: 93 class SP { double a; // Ph n th c double b; // Ph n o public: SP operator-(); }; SP SP:: operator-() { SP u ; u.a = - this->a ; u.b = - this->b ; return u; } Cách dùng: SP u, v; u = -v; Chú ý: Các phép toán ++ có th s d ng theo hai cách khác (ti n t h u t ) nên đ nh nghĩa địi h i ph i có hai cách khác sau: + Cho d ng ti n t : operator++() operator () + Cho d ng h u t s d ng thêm ñ i gi int: operator++(int) operator (int) 3.3 Toán t hai toán h ng V i phương th c toán t hai tốn h ng tr this ng v i toán h ng th nh t, nên phương th c ch c n dùng m t ñ i tư ng minh đ bi u th tốn h ng th hai Ví d phương th c tốn t ‘+’ ñ c ng hai ñ i tư ng ki u SP (s ph c) có th vi t sau: class SP { double a; // Ph n th c double b; // Ph n o public: SP operator+(SP u2); }; 94 SP SP:: operator+(SP u2) { SP u ; u.a = this->a + u2.a ; u.b = this->b + u2.b ; return u; } Cách dùng: SP p, p, r; r = p+q; § ð NH NGHĨA CH NG M T S TỐN T 4.1 Tốn t gán ‘=’ Trong m i l p đ u có m t tốn t gán m c đ nh, n u thành ph n d li u khơng có tr tốn t gán m c đ nh ñ ñáp ng yêu c u, không c n thi t ph i đ nh nghĩa ch ng tốn t gán Khi đ nh nghĩa ch ng tốn t gán ph i ñư c ñ nh nghĩa hàm thành ph n c a l p, tốn t hai ngơi nên s ch c n m t tham s hàm toán t Phép gán a=b th c ch t ñư c hi u a.operator=(b) b có th đư c truy n theo dư i d ng tham tr ho c tham chi u Vi c truy n theo tham tr địi h i s có m t c a hàm t o chép, th n a có th làm chương trình ch y ch m m t th i gian chép m t lư ng d li u l n Vì v y b thư ng đư c truy n cho hàm toán t operator= dư i d ng tham chi u Giá tr tr v c a hàm toán t ph thu c vào m c ñích s d ng c a bi u th c gán Gi s a, b, c ñ i tư ng ki u X, n u giá tr tr v c a hàm toán t gán ki u void khơng th th c hi n phép gán a=b=c Ví d : class DT { int n; float *a; public: DT() { } DT(int n1); ~DT() { delete a; } void hien(); DT& operator=(DT& d); }; DT::DT(int n1) { n= n1; a= new float[n]; 95 for (int i=0; i