intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Kỹ thuật lập trình hướng đối tư - Chapter 4

Chia sẻ: Nguyễn Nhi | Ngày: | Loại File: PDF | Số trang:32

44
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Quá tải hàm • Quá tải hàm tạo • Hàm tạo bản sao • Hàm với các đối số mặc định • Tính không xác định khi quá tải hàm • Điạ chỉ của hàm quá tải

Chủ đề:
Lưu

Nội dung Text: Kỹ thuật lập trình hướng đối tư - Chapter 4

  1. Chöông 4 Quaù taûi haøm • Quaù taûi haøm taïo • Haøm taïo baûn sao • Haøm vôùi caùc ñoái soá maëc ñònh • Tính khoâng xaùc ñònh khi quaù taûi haøm • Ñiaï chæ cuûa haøm quaù taûi
  2. Chöông 4 Quaù taûi haøm 104 104
  3. Chöông 4 Quaù taûi haøm 105 I/ Quaù taûi haøm taïo (constructor overloading ) Coù theå quaù taûi haøm taïo cuûa moät lôùp, nhöng khoâng quaù taûi haøm huûy. Haøm taïo cuûa lôùp phaûi phuø hôïp vôùi caùch maø ñoái töôïng cuûa lôùp ñoù ñöôïc khai baùo. Neáu khoâng loãi thôøi gian bieân dòch seõ xaûy ra. Coù 3 lyù do caàn quaù taûi haøm taïo : + ñeå coù tính linh hoaït + ñeå hoå trôï maûng + ñeå taïo caùc haøm taïo baûn sao Haïn cheá : neáu thöïc hieän quaù taûi nhieàu laàn coù theå taïo ra taùc duïng huûy hoaïi treân lôùp. • Quaù taûi haøm taïo vôùi khôûi ñaàu moät ñoái töôïng hoaëc khoâng khôûi ñaàu ñoái töôïng Ví duï 1.1 #include class myclass { int x; public: // overload constructor two ways myclass() { x = 0; } // no initializer myclass(int n) { x = n; } // initializer int getx() { return x; } }; int main() { myclass o1(10); // declare with initial value myclass o2; // declare without initializer cout
  4. Chöông 4 Quaù taûi haøm 106 • Quaù taûi haøm taïo ñeå cho caùc ñoái töôïng rieâng leõ laãn caùc maûng ñoái töôïng xaûy ra trong chöông trình. Ví duï 1.2 #include class myclass { int x; public: // overload constructor two ways myclass() { x = 0; } // no initializer myclass(int n) { x = n; } // initializer int getx() { return x; } }; int main() { myclass o1[10]; // declare array without initializers myclass o2[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // declare with initializers int i; for(i=0; i
  5. Chöông 4 Quaù taûi haøm 107 Ví duï 1.3 #include #include // included for sscanf() class date { int day, month, year; public: date(char *str); date (int m, int d, int y) { day = d; month = m; year = y; } void show() { cout
  6. Chöông 4 Quaù taûi haøm 108 • Quaù taûi haøm taïo khi maûng ñoäng cuûa lôùp ñöôïc caáp phaùt. Ñieàu naøy giuùp giaûi quyeát haïn cheá trong chöông 3, phaàn IV/2, moät maûng ñoäng khoâng theå ñöôïc khôûi ñaàu, xem ví duï 4.6. Ví duï 1.4 #include class myclass { int x; public: // overload constructor two ways myclass() { x = 0; } // no initializer myclass(int n) { x = n; } // initializer int getx() { return x; } void setx(int n) { x = n; } }; int main() { myclass *p; myclass ob(10); // initialize single variable p = new myclass[10]; // can't use initializers here if(!p) { cout
  7. Chöông 4 Quaù taûi haøm 109 return 0; } Baøi taäp I 1. Cho lôùp sau, haõy boå sung hai haøm taïo. Haøm taïo thöù nhaát khoâng nhaän tham soá, haøm naøy duøng toaùn töû new caáp phaùt 255 bytes boä nhôù, khôûi ñaàu boä nhôù nhö moät chuoãi roãng vaø cho len = 255. Haøm taïo thöù hai nhaän hai tham soá, tham soá thöù nhaát laø chuoãi duøng ñeå khôûi ñaàu vaø tham soá kia laø soá byte ñeå caáp phaùt. Cho phieân baûn naøy caáp phaùt löôïng boä nhôù ñaõ ñöôïc chæ roõ vaø cheùp chuoåi vaøo boä nhôù. Thöïc hieän vieäc kieåm tra giôùi haïn bieân caàn thieát vaø chöùng toû caùc haøm taïo seõ hoaït ñoäng qua moät chöông trình ngaén. class strtype { char *p; int len; public: char *getstring() { return p; } int getlength() { return len; } }; 2. Töø baøi taäp II, 2 chöông 2, boå sung haøm taïo khoâng nhaän tham soá vaø moät phieân baûn ñöôïc quaù taûi ñeå nhaän giôø heä thoáng döôùi daïng ñöôïc traû veà bôûi haøm chuaån clock(). II/ Taïo vaø söû duïng haøm taïo baûn sao (copy constructor) 1/ Khaùi nieäm Haøm taïo baûn sao laø kieåu ñaëc bieät cuûa haøm taïo ñöôïc quaù taûi. Khi moät ñoái töôïng ñöôïc truyeàn cho moät haøm, baûn sao töøng bit moät cuûa ñoái töôïng ñoù ñöôïc taïo ra vaø ñöôïc truyeàn cho tham soá cuûa haøm ñeå nhaän ñoái töôïng. 109
  8. Chöông 4 Quaù taûi haøm 110 Tuy nhieân, coù nhöõng tröôøng hôïp trong ñoù baûn sao ñoàng nhaát laø nhö khoâng mong muoán. Chaúng haïn, neáu ñoái töôïng coù con troû tôùi boä nhôù ñöôïc caáp phaùt, thì baûn sao seõ troû tôùi cuøng boä nhôù nhö ñoái töôïng goác ñaõ laøm. Do ñoù, neáu baûn sao taïo ra söï thay ñoåi cho noäi dung boä nhôù thì noù cuõng seõ ñöôïc thay ñoåi ñoái vôùi ñoái töôïng goác. Khi moät haøm keát thuùc, baûn sao seõ bò huûy vaø haøm huûy cuûa noù ñöôïc goïi. Ñieàu naøy daãn ñeán nhöõng taùc duïng khoâng mong muoán laøm aûnh höôûng ñeán ñoái töôïng goác. Khi moät ñoái töôïng ñöôïc traû veà töø moät haøm tình traïng töông töï cuõng seõ xaûy ra. Trình bieân dòch seõ taïo ra moät ñoái töôïng taïm ñeå giöõ baûn sao cuûa giaù trò do haøm traû veà. Ñoái töôïng taïm naøy seõ ra khoûi phaïm vi moät khi giaù trò ñöôïc traû veà cho thuû tuïc goïi, khieán haøm huûy cuûa ñoái töôïng taïm ñöôïc goïi. Neáu haøm huûy huûy boû thöù gì caàn cho thuû tuïc goïi, chaúng haïn noù giaûi phoùng boä nhôù caáp phaùt ñoäng, thì raéc roái seõ xaûy ra. Nhö vaäy, coát loõi cuûa vaán ñeà treân laø baûn sao töøng bit cuûa ñoái töôïng ñöôïc taïo ra vaø thöïc hieän. Ñeå ngaên chaën vaán ñeà naøy, laäp trình vieân caàn xaùc ñònh chính xaùc nhöõng gì xaûy ra khi baûn sao cuûa moät ñoái töôïng ñöôïc thöïc hieän ñeå traùnh ñöôïc nhöõng taùc duïng khoâng mong muoán. Haøm taïo baûn sao seõ giaûi quyeát ñöôïc vaán ñeà treân. Khi ñònh nghóa haøm taïo baûn sao, laäp trình vieân coù theå hoaøn toaøn kieåm soaùt chính xaùc nhöõng gì xaûy ra khi baûn sao cuûa moät ñoái töôïng ñöôïc thöïc hieän. • Caàn phaân bieät hai tröôøng hôïp trong ñoù giaù trò cuûa moät ñoái töôïng ñöôïc truyeàn cho ñoái töôïng khaùc : + Tröôøng hôïp thöù nhaát laø pheùp gaùn. + Tröôøng hôïp thöù hai laø söï khôûi ñaàu, coù theå xaûy ra theo 3 caùch : - Khi moät ñoái töôïng ñöôïc duøng ñeå khôûi ñaàu moät ñoái töôïng khaùc trong caâu leänh khai baùo. - Khi moät ñoái töôïng ñöôïc truyeàn nhö tham soá cho haøm. - Khi moät ñoái töôïng taïm ñöôïc taïo ra duøng ñeå laøm giaù trò traû veà bôûi moät haøm. Haøm taïo baûn sao chæ aùp duïng cho söï khôûi ñaàu. Noù khoâng aùp duïng cho pheùp gaùn. Haøm taïo baûn sao khoâng aûnh höôûng ñeán caùc pheùp gaùn. 110
  9. Chöông 4 Quaù taûi haøm 111 2/ Cuù phaùp • Daïng toång quaùt cuûa haøm taïo baûn sao classname(const classname &obj) { // body of constructor } obj laø moät tham chieáu tôùi moät ñoái töôïng ñöôïc duøng ñeå khôûi ñaàu moät ñoái töôïng khaùc • Daïng môû roäng cuûa haøm taïo baûn sao (coù nhieàu ñoái soá) classname(const classname &obj, int x = 0) { // body of constructor } Ñoái soá thöù nhaát laø moät tham chieáu tôùi ñoái töôïng ñöôïc sao cheùp, vaø caùc ñoái töôïng khaùc ñeàu maëc ñònh. Tính linh hoaït naøy cho pheùp taïo ra caùc haøm taïo baûn sao coù nhöõng coâng duïng khaùc. Ví duï, lôùp ñöôïc goïi laø myclass vaø y laø ñoái töôïng cuûa myclass thì caùc leänh sau ñaây seõ duøng ñeán haøm taïo baûn sao cuûa myclass : myclass x = y; // y explicitly initializing x func1(y); // y passed as a parameter y = func2(); // y receiving a returned object Trong hai tröôøng hôïp ñaàu, moät tham chieáu tôùi y seõ ñöôïc truyeàn cho haøm taïo baûn sao. Tröôøng hôïp thöù ba, moät tham chieáu tôùi ñoái töôïng ñöôïc traû veà bôûi func2() seõ ñöôïc truyeàn cho haøm taïo baûn sao. • Taïo moät maûng soá nguyeân "an toaøn" coù kieåm tra giôùi haïn bieân Ví duï 2.1 111
  10. Chöông 4 Quaù taûi haøm 112 /* This program creates a "safe" array class. Since space for the array is dynamically allocated, a copy constructor is provided to allocate memory when one array object is used to initialize another. */ #include #include class array { int *p; int size; public: array(int sz) { // constructor p = new int[sz]; if(!p) exit(1); size = sz; cout =0 && i
  11. Chöông 4 Quaù taûi haøm 113 int i; size = a.size; p = new int[a.size]; // allocate memory for copy if(!p) exit(1); for(i=0; i
  12. Chöông 4 Quaù taûi haøm 114 • Haøm taïo baûn sao giuùp ngaên ngöøa moät soá vaán ñeà lieân quan ñeán vieäc truyeàn caùc kieåu ñoái töôïng naøo ñoù cho haøm. Ví duï 2.2 // This program has an error. #include #include #include class strtype { char *p; public: strtype(char *s); ~strtype() { delete [] p; } char *get() { return p; } }; strtype::strtype(char *s) { int l; l = strlen(s)+1; p = new char [l]; if(!p) { cout
  13. Chöông 4 Quaù taûi haøm 115 int main() { strtype a("Hello"), b("There"); show(a); show(b); return 0; } @ Haõy tìm nguyeân nhaân gaây ra loãi ? Ví duï 2.3 Hieäu chænh chöông trình trong ví duï 2.2 /* This program uses a copy constructor to allow strtype objects to be passed to functions. */ #include #include #include class strtype { char *p; public: strtype(char *s); // constructor strtype(const strtype &o); // copy constructor ~strtype() { delete [] p; } // destructor char *get() { return p; } }; // "Normal" constructor strtype::strtype(char *s) { int l; l = strlen(s)+1; p = new char [l]; if(!p) { cout
  14. Chöông 4 Quaù taûi haøm 116 } strcpy(p, s); } // Copy constructor strtype::strtype(const strtype &o) { int l; l = strlen(o.p)+1; p = new char [l]; // allocate memory for new copy if(!p) { cout
  15. Chöông 4 Quaù taûi haøm 117 Baøi taäp II 1. Xeùt chöông trình sau, haõy giaûi thích taïi sao coù keát quaû naøy ? Constructing normally Constructing normally Constructing copy #include class myclass { public: myclass(); myclass(const myclass &o); myclass f(); }; myclass::myclass() // Normal constructor { cout
  16. Chöông 4 Quaù taûi haøm 118 2. Tìm loãi sai trong chöông trình vaø yeâu caàu chænh lyù ? #include #include class myclass { int *p; public: myclass(int i); ~myclass() { delete p; } friend int getval(myclass o); }; myclass::myclass(int i) { p = new int; if(!p) { cout
  17. Chöông 4 Quaù taûi haøm 119 III/ Söû duïng caùc ñoái soá maëc ñònh (default argument) • Ñoái soá maëc ñònh cho pheùp gaùn moät giaù trò maëc ñònh cho moät tham soá khi khoâng coù ñoái soá töông öùng ñöôïc chæ roõ khi haøm ñöôïc goïi. Ñoái soá maëc ñònh lieân quan ñeán söï quaù taûi haøm, söû duïng caùc ñoái soá maëc ñònh chuû yeáu laø daïng ngaén cuûa quaù taûi haøm. • Ñeå gaùn moät ñoái soá maëc ñònh cho moät tham soá thì sau tham soá phaûi coù daáu baèng vaø moät giaù trò muoán maëc ñònh neáu khoâng coù ñoái soá töông öùng khi haøm ñöôïc goïi. Ví duï 3.1 // A simple first example of default arguments. #include void f(int a = 0, int b = 0) { cout
  18. Chöông 4 Quaù taûi haøm 120 Haøm f() coù theå goïi theo 3 caùch : + noù ñöôïc goïi vôí caû hai ñoái soá ñöôïc chæ roõ. + noù ñöôïc goïi chæ vôí ñoái soá thöù nhaát ñöôïc chæ roõ. Tröôøng hôïp naøy, b seõ maëc ñònh veà 0. + f() coù theå ñöôïc goïi laø khoâng coù ñoái soá , a vaø b maëc ñònh veà 0. nghiaõ laø caùc caâu leänh sau ñeàu ñuùng : f() ; // a and b default to 0 f(10) ; // a is 10, b defaults to 0 f(10, 99) ; // a is 10, b is 99 Löu yù, trong ví duï naøy, khoâng coù caùch ñeå maëc ñònh a vaø chæ roõ b . • Khi ñoái soá maëc ñònh ñaàu tieân ñöôïc chæ roõ, taát caû caùc tham soá theo sau cuõng phaûi coù maëc ñònh. Ví duï moät phieân baûn khaùc cuûa f() sau ñaây seõ taïo ra loãi thôøi gian bieân dòch : void f(int a = 0, int b) // wrong! b must have default, too { cout
  19. Chöông 4 Quaù taûi haøm 121 Ví duï 3.2 Caùc ñoái soá maëc ñònh lieân quan ñeán söï quaù taûi haøm // Compute area of a rectangle using overloaded functions. #include // Return area of a non-square rectangle. double rect_area(double length, double width) { return length * width; } // Return area of a square. double rect_area(double length) { return length * length; } int main() { cout
  20. Chöông 4 Quaù taûi haøm 122 double rect_area(double length, double width = 0) { if(!width) width = length; return length * width; } int main() { cout
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2