Xem mẫu

  1. Ch­¬ng 4 Hµm t¹o, hµm huû vµ c¸c vÊn ®Ò liªn quan Ch­¬ng nµy tr×nh bÇy mét sè vÊn ®Ò cã tÝnh chuyªn s©u h¬n vÒ líp nh­: + Hµm t¹o (constructor) + Hµm huû (destructor) + To¸n tö g¸n vµ hµm t¹o sao chÐp + Mèi liªn quan gi÷a hµm t¹o vµ ®èi t­îng thµnh phÇn + C¸c thµnh phÇn tÜnh + Líp b¹n, hµm b¹n + §èi t­îng h»ng + Ph­¬ng thøc inline § 1. Hµm t¹o (constructor) 1.1. C«ng dông Hµm t¹o còng lµ mét ph­¬ng thøc cña líp (nh­ng kh¸ ®Æc biÖt) dïng ®Ó t¹o dùng mét ®èi t­ îng míi. Ch­¬ng tr×nh dÞch sÏ cÊp ph¸t bé nhí cho ®èi t­îng sau ®ã sÏ gäi ®Õn hµm t¹o. Hµm t¹o sÏ khëi g¸n gi¸ trÞ c ho c¸c thuéc tÝnh cña ®èi t­îng vµ cã thÓ thùc hiÖn mét sè c«ng viÖc kh¸c nh»m chuÈn bÞ cho ®èi t­îng míi. 1.2. C¸ch viÕt hµm t¹o 1.2.1. §iÓm kh¸c cña hµm t¹o vµ c¸c ph­¬ng thøc th«ng th­êng Khi viÕt hµm t¹o cÇn ®Ó ý 3 sù kh¸c biÖt cña hµm t¹o so víi c¸c ph­¬ng thøc kh¸c nh­ sau: + Tªn cña hµm t¹o: Tªn cña hµm t¹o b¾t buéc ph¶i trïng víi tªn cña líp. + Kh«ng khai b¸o kiÓu cho hµm t¹o. 150 Hµm t¹o kh«ng cã kÕt qu¶ tr¶ vÒ. +
  2. 1.2.2. Sù gièng nhau cña hµm t¹o vµ c¸c ph­¬ng thøc th«ng th­êng Ngoµi 3 ®iÓm kh¸c biÖt trªn, hµm t¹o ®­îc viÕt nh­ c¸c ph­¬ng thøc kh¸c: + Hµm t¹o cã thÓ ®­îc x©y dùng bªn trong hoÆc bªn ngoµi ®Þnh nghÜa líp. + Hµm t¹o cã thÓ cã ®èi hoÆc kh«ng cã ®èi. + Trong mét líp cã thÓ cã nhiÒu hµm t¹o (cïng tªn nh­ng kh¸c bé ®èi). VÝ dô sau ®Þnh nghÜa líp DIEM_DH (§iÓm ®å ho¹) cã 3 thuéc tÝnh: int x; // hoµnh ®é (cét) cña ®iÓm int y; // tung ®é (hµng) cña ®iÓm int m; // mÇu cña ®iÓm vµ ®­a vµo 2 hµm t¹o ®Ó khëi g¸n cho c¸c thuéc tÝnh cña líp: // Hµm t¹o kh«ng ®èi: Dïng c¸c gi¸ trÞ cè ®Þnh ®Ó khëi g¸n cho // x, y, m DIEM_DH() ; // Hµm t¹o cã ®èi: Dïng c¸c ®èi x1, y1, m1 ®Ó khëi g¸n cho // x, y, m // §èi m1 cã gi¸ trÞ mÆc ®Þnh 15 (mÇu tr¾ng) DIEM_DH(int x1, int y1, int m1=15) ; class DIEM_DH { private: int x, y, m ; public: //Hµm t¹o kh«ng ®èi: khëi g¸n cho x=0, y=0, m=1 // Hµm nµy viÕt bªn trong ®Þnh nghÜa líp DIEM_DH()
  3. { x=y=0; m=1; } // Hµm t¹o nµy x©y dùng bªn ngoµi ®Þnh nghÜa líp DIEM_DH(int x1, int y1, int m1=15) ; // C¸c ph­¬ng thøc kh¸c }; // X©y dùng hµm t¹o bªn ngoµi ®Þnh nghÜa líp DIEM_DH:: DIEM_DH(int x1, int y1, int m1) { x=x1; y=y1; m=m1; } 1.3. Dïng hµm t¹o trong khai b¸o + Khi ®· x©y dùng c¸c hµm t¹o, ta cã thÓ dïng chóng trong khai b¸o ®Ó t¹o ra mét ®èi t­îng ®ång thêi khëi g¸n cho c¸c thuéc tÝnh cña ®èi t­îng ®­îc t¹o. Dùa vµo c¸c tham sè trong khai b¸o mµ Tr×nh biªn dÞch sÏ biÕt cÇn gäi ®Õn hµm t¹o nµo. + Khi khai b¸o mét biÕn ®èi t­îng cã thÓ sö dông c¸c tham sè ®Ó khëi g¸n cho c¸c thuéc tÝnh cña biÕn ®èi t­îng. + Khi khai b¸o m¶ng ®èi t­îng kh«ng cho phÐp dïng c¸c tham sè ®Ó khëi g¸n. + C©u lÖnh khai b¸o mét biÕn ®èi t­îng sÏ gäi tíi hµm t¹o 1 lÇn + C©u lÖnh khai b¸o mét m¶ng n ®èi t­îng sÏ gäi tíi hµm t¹o n lÇn. VÝ dô: DIEM_DH d; // Gäi tíi hµm t¹o kh«ng ®èi. // KÕt qu¶ d.x=0, d.y=0, d.m=1 DIEM_DH u(200,100,4); // Gäi tíi hµm t¹o cã ®èi. 152
  4. // KÕt qu¶ u.x=200, u.y=100, d.m=4 DIEM_DH v(300,250); // Gäi tíi hµm t¹o cã ®èi. // KÕt qu¶ v.x=300, v.y=250, d.m=15 DIEM_DH p[10] ; // Gäi tíi hµm t¹o kh«ng ®èi 10 lÇn Chó ý: Víi c¸c hµm cã ®èi kiÓu líp, th× ®èi chØ xem lµ c¸c tham sè h×nh thøc, v× vËy khai b¸o ®èi (trong dßng ®Çu cña hµm) sÏ kh«ng t¹o ra ®èi t­îng míi vµ do ®ã kh«ng gäi tíi c¸c hµm t¹o. 1.4. Dïng hµm t¹o trong cÊp ph¸t bé nhí + Khi cÊp ph¸t bé nhí cho mét ®èi t­îng cã thÓ dïng c¸c tham sè ®Ó khëi g¸n cho c¸c thuéc tÝnh cña ® èi t­îng, vÝ dô: DIEM_DH *q =new DIEM_DH(50,40,6);//Gäi tíi hµm t¹o cã ®èi // KÕt qu¶ q->x=50, q->y=40, q->m=6 DIEM_DH *r = new DIEM_DH ; // Gäi tíi hµm t¹o kh«ng ®èi // KÕt qu¶ r->x=0, r->y= 0, r->m=1 + Khi cÊp ph¸t bé nhí cho mét dÉy ®èi t­îng kh«ng cho phÐp dïng tham sè ®Ó khëi g¸n, vÝ dô: int n=20; DIEM_DH *s = new DIEM_DH[n] ; // Gäi tíi hµm t¹o kh«ng // ®èi 20 lÇn. 1.5. Dïng hµm t¹o ®Ó biÓu diÔn c¸c ®èi t­îng h»ng + Nh­ ®· biÕt, sau khi ®Þnh nghÜa líp DIEM_DH th× cã thÓ xem líp nµy nh­ mét kiÓu d÷ liÖu nh­ int, double, char, ... Víi kiÓu int chóng ta cã c¸c h»ng int, nh­ 356. Víi kiÓu double chóng ta cã c¸c h»ng double, nh­ 98.75 Kh¸i niÖm h»ng kiÓu int, h»ng kiÓu double cã thÓ më réng cho h»ng kiÓu DIEM_DH + §Ó biÓu diÔn mét h»ng ®èi t­îng (hay cßn gäi: §èi t­îng h»ng) chóng ta ph¶i dïng tíi hµm t¹o. MÉu viÕt nh­ sau:
  5. Tªn_líp(danh s¸ch tham sè) ; VÝ dô ®èi víi líp DIEM_DH nãi trªn, cã thÓ viÕt nh­ sau: DIEM_DH(345,123,8) // BiÓu thÞ mét ®èi t­îng kiÓu DIEM_DH // cã c¸c thuéc tÝnh x=345, y=123, m=8 Chó ý: Cã thÓ sö dông mét h»ng ®èi t­îng nh­ mét ®èi t­îng. Nãi c¸ch kh¸c, cã thÓ dïng h»ng ®èi t­îng ®Ó thùc hiÖn mét ph­¬ng thøc, vÝ dô nÕu viÕt: DIEM_DH(345,123,8).in(); th× cã nghÜa lµ thùc hiÖn ph­¬ng thøc in() ®èi víi h»ng ®èi t­îng. 1.6. VÝ dô minh ho¹ Ch­¬ng tr×nh sau ®©y minh ho¹ c¸ch x©y dùng hµm t¹o vµ c¸ch sö dïng hµm t¹o trong khai b¸o, trong cÊ p ph¸t bé nhí vµ trong viÖc biÓu diÔn c¸c h»ng ®èi t­îng. //CT4_02.CPP #include #include #include class DIEM_DH { private: int x,y,m; public: // Hµm b¹n dïng ®Ó in ®èi t­îng DIEM_DH friend void in(DIEM_DH d) { cout
  6. void in() { cout
  7. in(d1); //Gäi hµm b¹n in() d2.in();//Gäi ph­¬ng thøc in() in(*d); //Gäi hµm b¹n in() DIEM_DH(2,2,2).in();//Gäi ph­¬ng thøc in() DIEM_DH t[3]; // 3 lÇn gäi hµm t¹o kh«ng ®èi DIEM_DH *q; // Gäi hµm t¹o kh«ng ®èi int n; cout > n; q=new DIEM_DH[n+1]; // (n+1) lÇn gäi hµm t¹o kh«ng ®èi for (int i=0;i
  8. //CT4_03.CPP // Hµm t¹o mÆc ®Þnh #include #include class DIEM_DH { private: int x,y,m; 156 public: // Phuong thuc void in() { cout
  9. getch(); } 2.2. NÕu trong líp ®· cã Ýt nhÊt mét hµm t¹o, th× hµm t¹o mÆc ®Þnh sÏ kh«ng ®­îc ph¸t sinh n÷a. Khi ®ã mäi c©u lÖnh x©y dùng ®èi t­îng míi ®Òu sÏ gäi ®Õn mét hµm t¹o cña líp. NÕu kh«ng t×m thÊy hµm t¹o cÇn gäi t h× Ch­¬ng tr×nh dÞch sÏ b¸o lçi. §iÒu nµy th­êng xÈy ra khi chóng ta kh«ng x©y dùng hµm t¹o kh«ng ®èi, nh­ng l¹i sö dông c¸c khai b¸o kh«ng tham sè nh­ vÝ dô sau: #include #include class DIEM_DH { private: int x,y,m; public: // Ph­¬ng thøc dïng ®Ó in ®èi t­îng DIEM_DH void in() { cout
  10. DIEM_DH d1(200,200,10); // Gäi tíi hµm t¹o cã ®èi DIEM_DH d2; // Gäi tíi hµm t¹o kh«ng ®èi d2= DIEM_DH(300,300,8); // Gäi tíi hµm t¹o cã ®èi d1.in(); d2.in(); getch(); } Trong c¸c c©u lÖnh trªn, chØ cã c©u lÖnh thø 2 trong hµm main() lµ bÞ b¸o lçi. C©u lÖnh nµy sÏ gäi t íi hµm t¹o kh«ng ®èi, mµ hµm nµy ch­a ®­îc x©y dùng. Gi¶i ph¸p: Cã thÓ chän mét trong 2 gi¶i ph¸p sau: - X©y dùng thªm hµm t¹o kh«ng ®èi. - G¸n gi¸ trÞ mÆc ®Þnh cho tÊt c¶ c¸c ®èi x1, y1 vµ m1 cña hµm t¹o ®· x©y dùng ë trªn. 158 heo ph­¬ng ¸n 2, ch­¬ng tr×nh cã thÓ söa nh­ sau: T #include #include class DIEM_DH { private: int x,y,m; public: // Ph­¬ng thøc dïng ®Ó in ®èi t­îng DIEM_DH void in() { cout
  11. { x=x1; y=y1; m=m1; } }; void main() { DIEM_DH d1(200,200,10); // Gäi tíi hµm t¹o, kh«ng dïng // tham sè mÆc ®Þnh DIEM_DH d2; // Gäi tíi hµm t¹o , dïng 3 tham sè mÆc ®Þnh d2= DIEM_DH(300,300); // Gäi tíi hµm t¹o, dïng 1 tham sè // mÆc ®Þnh d1.in(); d2.in(); getch(); } § 3. Líp ®a thøc Ch­¬ng tr×nh d­íi ®©y lµ sù c¶i tiÕn ch­¬ng tr×nh trong môc 8.5 cña ch­¬ng 3 b»ng c¸ch ®­a vµo 2 hµm t¹o: //Hµm t¹o kh«ng ®èi DT() { this->n=0; this->a=NULL; } //Hµm t¹o cã ®èi DT(int n1) {
  12. this->n=n1 ; this->a = new double[n1+1]; } Hµm t¹o cã ®èi sÏ t¹o mét ®èi t­îng míi (kiÓu DT) gåm 2 thuéc tÝnh lµ biÕn nguyªn n vµ con trá a. Ngoµi ra cßn cÊp ph¸t bé vïng nhí (cho a) ®Ó chøa c¸c hÖ sè cña ®a thøc. NÕu kh«ng x©y dùng hµm t¹o, mµ sö dông hµm t¹o mÆc ®Þnh th× c¸c ®èi t­îng (kiÓu DT) t¹o ra bëi c¸c l Önh khai b¸o sÏ ch­a cã bé nhí ®Ó chøa ®a thøc. Nh­ vËy ®èi t­îng t¹o ra ch­a hoµn chØnh vµ ch­a dïng ®­ îc. §Ó cã mét ®èi t­îng hoµn chØnh ph¶i qua 2 b­íc: + Dïng khai b¸o ®Ó t¹o c¸c ®èi t­îng, vÝ dô: DT d; + CÊp ph¸t vïng nhí (cho ®èi t­îng) ®Ó chøa ®a thøc, vÝ dô: d.n = m; d.a = new double[m+1] ; Quy tr×nh nµy ®­îc ¸p dông trong c¸c ph­¬ng thøc to¸n tö cña ch­¬ng tr×nh trong môc 8.5 ch­¬ng 3. Râ rµng quy tr×nh nµy võa dµi võa kh«ng tiÖn lîi, l¹i hay m¾c lçi, v× ng­êi lËp tr×nh hay quªn kh«ng cÊp ph¸t bé nhí. ViÖc dïng c¸c hµm t¹o ®Ó s¶n sinh ra c¸c ®èi t­îng hoµn chØnh tá ra tiÖn lîi h¬n, v× tr¸nh ®­îc c¸c thao t¸c phô (nh­ cÊp ph¸t bé nhí) n»m bªn ngoµi khai b¸o. Ph­¬ng ¸n dïng hµm t¹o sÏ ®­îc sö dông trong c¸c 160 ph­¬ng thøc to¸n tö cña ch­¬ng tr×nh d­íi ®©y: + Néi dung ch­¬ng tr×nh gåm: - NhËp, in c¸c ®a thøc p, q, r, s - TÝnh ®a thøc: f = -(p + q)*(r - s) - NhËp c¸c sè thùc x1 vµ x2 - TÝnh f(x1) (b»ng c¸ch dïng ph­¬ng thøc operator^) - TÝnh f(x2) (b»ng c¸ch dïng hµm F) // CT4_05.CPP #include
  13. #include #include class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc // a0, a1,... public: DT() { this->n=0; this->a=NULL; } DT(int n1) { this->n=n1 ; this->a = new double[n1+1]; } friend ostream& operator> (istream& is,DT &d); DT operator-(); DT operator+(const DT &d2); DT operator-(DT d2); DT operator*(const DT &d2); double operator^(const double &x); // Tinh gia tri da thuc double operator[](int i)
  14. { if (i
  15. return os; } istream& operator>> (istream& is,DT &d) { if (d.a!=NULL) delete d.a; cout > d.n; d.a = new double[d.n+1]; cout
  16. int k,i; k = n > d2.n ? n : d2.n ; DT d(k); for (i=0; i
  17. for (i=0 ; i
  18. cout
  19. - NÕu trong líp PS ch­a x©y dùng hµm t¹o sao chÐp, th× c©u lÖnh nµy sÏ gäi tíi mét hµm t¹o sao chÐp mÆc ®Þnh (cña C++). Hµm nµy sÏ sao chÐp néi dung tõng bit cña u vµo c¸c bi t t­¬ng øng cña v. Nh­ vËy c¸c vïng nhí cña u vµ v sÏ cã néi dung nh­ nhau. Râ rµng trong ®a sè c¸c tr­êng hîp, nÕu líp kh«ng cã c¸c thuéc t Ýnh kiÓu con trá hay tham chiÕu, th× viÖc dïng c¸c hµm t¹o sao chÐp mÆc ®Þnh (®Ó t¹o ra mét ®èi t­îng míi cã néi dung nh­ mét ®èi t­îng cho tr­íc) lµ ®ñ vµ kh«ng cÇn x©y dùng mét hµm t¹o sao chÐp míi. - NÕu trong líp PS ®· cã hµm t¹o sao chÐp (c¸ch viÕt sÏ nãi sau) th× c©u lÖnh: PS v(u) ; 166 sÏ t¹o ra ®èi t­îng míi v, sau ®ã gäi tíi hµm t¹o sao chÐp ®Ó khëi g¸n v theo u. VÝ dô sau minh ho¹ c¸ch dïng hµm t¹o sao chÐp mÆc ®Þnh: Trong ch­¬ng tr×nh ®­a vµo líp PS (ph©n sè): + C¸c thuéc tÝnh gåm: t (tö sè) vµ m (mÉu). + Trong líp kh«ng cã ph­¬ng thøc nµo c¶ mµ chØ cã 2 hµm b¹n lµ c¸c hµm to¸n tö nhËp (>>) vµ xuÊt (
  20. return os; } friend istream& operator>> (istream& is, PS &p) { cout > p.t >> p.m ; return is; } }; void main() { PS d; cout > d; cout
nguon tai.lieu . vn