Bài giảng môn Lập trình hướng đối tượng - Chương 3: Lớp (class)

pdf 17 trang phuongnguyen 6620
Bạn đang xem tài liệu "Bài giảng môn Lập trình hướng đối tượng - Chương 3: Lớp (class)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_mon_lap_trinh_huong_doi_tuong_chuong_3_lop_class.pdf

Nội dung text: Bài giảng môn Lập trình hướng đối tượng - Chương 3: Lớp (class)

  1. Ch ươ ng 3: L p (class) 3.1. Nh c l i: • Ý t ưng chính c a l p trình h ưng đ i t ưng đĩ là tr u t ưng hố d li u • Mt ch ươ ng trình h ưng đ i t ưng ph i th c hi n vi c tr u t ưng hố d li u, ngh ĩa là: o Kt h p đnh ngh ĩa d li u và các hàm thao tác trên các d li u đĩ vào trong m t m t ki u d li u đưc g i là m t l p (class). Lp là ki u d li u tr u tr ưng, th ưng đưc g i là các ki u d li u h ưng đ i t ưng. o Các l p ph i ki m tra vi c truy xu t vào các thành ph n d li u c a chúng. o Sau khi m t l p đã đưc đinh ngh ĩa, ta s d ng l p đĩ nh ư m t ki u d li u cĩ s n mà khơng c n quan tâm đ n các cài đt bên trong ca l p đĩ (tr u t ưng hố). 3.2. Gi i thi u: ð b t đ u cho vi c đi sâu tìm hi u các khái ni m, ta hãy quan sát m t ch ươ ng trình hưng đ i t ưng đơ n gi n. Tồn b ch ươ ng trình này g m 3 files: complex.h, complex.cpp, main.cpp. Sau đây là n i dung các file. File complex.h : // File Name: complex.h // Author: Dung Dang // Description: This file defines class CComplex // Date: Feb 08, 2006 #ifndef ___COMPLEX_H #define ___COMPLEX_H // ðnh ngh ĩa class class CComplex { private : double m_dReal; // Thành ph n d li u double m_dImag; // Thành ph n d li u public : // CÁC PH ƯƠ NG TH C (MOTHOD) CComplex( double r = 0, double i = 0); // Constructor ~CComplex(); // Destructor void PrintMe(); CComplex operator +( const CComplex &c); // Tốn t c ng CComplex operator -(const CComplex &c); // Tốn t tr }; Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 1
  2. #endif File complex.cpp : // File name: Complex.cpp // Author: Dung Dang // Description: This file implements methods of the CComplex class. // Date: Feb 08, 2006 #include "Complex.h" extern "C" // Dùng extern đ TBD khơng đ i tên các hàm trong stdio.h { #include } // ðnh ngh ĩa constructor CComplex::CComplex( double r, double i) { m_dReal = r; m_dImag = i; } // ðnh ngh ĩa destructor CComplex::~CComplex() { return ; // Trong ví d này, destructor ko làm gì c . } // ðnh ngh ĩa ph ươ ng th c PrintMe() void CComplex::PrintMe() { printf( "(%g , %g)" , m_dReal, m_dImag); } // ðnh ngh ĩa tốn t c ng CComplex CComplex:: operator +( const CComplex &c) { CComplex temp; temp.m_dReal = m_dReal + c.m_dReal; temp.m_dImag = m_dImag + c.m_dImag; return temp; } // ðnh ngh ĩa tốn t tr CComplex CComplex:: operator -(const CComplex &c) { CComplex temp; temp.m_dReal = m_dReal - c.m_dReal; temp.m_dImag = m_dImag - c.m_dImag; return temp; } File main.cpp : // File Name: main.cpp Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 2
  3. // Author: Dung Dang // Description: This file contains the main function of the program. // This function uses class CComplex. // Date: Feb 08, 2006 #include "Complex.h" #include // Th ư vi n xu t nh p chu n c a C++ using namespace std; // Dùng namespace chu n. int main() { // K.báo các bi n a, b,c ,d là các đi t ưng thu c l p CComplex CComplex a(1.0, 2.0); CComplex b(3.0, 4.0); CComplex c, d; // Th hi n các tốn t + và - (đã đưc đ nh ngh ĩa trong CComplex) c = a + b; d = b + c - a; cout >i; return 0; } Kt qu trên màn hình sau khi th c hi n ch ươ ng trình này: c = (4 , 6) and d = (6 , 8) Sau đây ta s xem xét c th làm th nào đ t o ra các l p trong C++. ð t o ra các l p, ta ph i làm hai vi c: đnh ngh ĩa l p và đnh ngh ĩa các ph ươ ng th c c a l p. 3.3. ðnh ngh ĩa l p • ð đ nh ngh ĩa m t l p, dùng t khố class, theo sau là tên c a l p. • Trong đnh ngh ĩa class, ngồi thành ph n d li u, cịn cĩ c các thành ph n hàm (các ph ươ ng th c). • Mt l p khơng th đ nh ngh ĩa m t thành ph n d li u cĩ ki u là chính nĩ (nh ưng đưc phép dùng tham chi u ho c con tr t i nĩ). • Trong ví d trên, ta cĩ các ph ươ ng th c CComplex, ~CComplex, PrintMe, +, - Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 3
  4. 3.4. Thành ph n d li u • ðưc khai báo trong đnh ngh ĩa l p t ươ ng t nh ư đi v i struct trong C. • Các thành ph n d li u th ưng đưc g i t t là các member. • Vi c truy xu t vào các thành ph n d li u nên thơng qua các ph ươ ng th c c a l p. Ví d : class CPoint { private : int m_x, m_y; public: // //Các ph ươ ng th c khác SetPoint( int x, int y) { if (x < 0) cout<< "Gia tri hoanh do khong hop le" ; else m_x = x; if (y < 0) cout<< "Gia tri tung do ko hop le" ; else m_y = y; } int GetX() { return m_x; } int GetY() { return m_y; } } 3.5. Ph ươ ng th c • Ph ươ ng th c g m 2 ph n: o Ph n khai báo ph ươ ng th c: đưc đ t trong đ nh ngh ĩa l p o Ph n đ nh ngh ĩa ph ươ ng th c: Cĩ th đ t trong đ nh ngh ĩa l p ho c ngồi. • Khi ph n đ nh ngh ĩa ph ươ ng th c n m ngồi đnh ngh ĩa l p, ta ph i dùng tốn t ly ph m v đ t sau tên l p (xem ví d ). • Trong tr ưng h p đnh ngh ĩa ph ươ ng th c n m ngồi đnh ngh ĩa l p, đ nh ngh ĩa lp ph i n m tr ưc đ nh ngh ĩa ph ươ ng th c. • Khi ph n đinh ngh ĩa ph ươ ng th c đưc đ t trong đ nh ngh ĩa l p, ph ươ ng th c đĩ tr thành ph ươ ng th c inline. • Mt ph ươ ng th c c a m t l p cĩ th g i b t k ỳ ph ươ ng th c nào khác c a l p đĩ. • Member và ph ươ ng th c khơng đưc phép trùng tên. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 4
  5. 3.6. ðiu khi n vi c truy xu t (Access Control) • ð điu khi n vi c truy xu t đ n các member ho c ph ươ ng th c c a m t l p, ta dùng các t khố sau: public , private , protected . Gi chung các t khố này là các access specifier . • Các access specifier cĩ tác d ng cho đ n khi m t access specifier m i đưc dùng. • Ví d : class A { public : int a; // public int b; // public int Func1(); // public protected : int c; // protected int d; // protected void Func2(); // protected void Func3( int a); // protected private : void Func4(); // private } Access specifier Ý ngh ĩa public Bt k ỳ n ơi nào trong ch ươ ng trình đu cĩ th truy c p vào các thành ph n (member) ho c ph ươ ng th c public. protected - Bên ngồi ph m vi l p khơng truy xu t đưc - Các l p con cĩ th truy xu t đưc private Bên ngồi ph m vi l p và ngay c l p con c ũng khơng truy xu t đưc. 3.7. ði t ưng • Mt bi n thu c class đưc g i là m t đ i t ưng. • Mi đ i t ưng ch a m t b d li u riêng. • ðnh ngh ĩa c a các ph ươ ng th c (method implementation) đưc dùng chung cho tt c các đ i t ưng c a l p. • Trong ví d trên, ta cĩ các đi t ưng: a, b, c, d. 3.8. Constructor • Khơng cĩ giá tr tr v . • Tên c a constructor trùng v i tên l p. • ðưc g i t đ ng khi đ i t ưng đưc t o. • Các l p d n xu t khơng th k th a các constructor và destructor c a l p c ơ s . • Trong ví d trên: CComplex là constructor. 3.9. Các constructor đc bi t: Cĩ 3 lo i constructor đ c bi t sau: Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 5
  6. 3.9.1. Constructor m c đ nh (default constructor) • Constructor m c đ nh khơng cĩ đ i s . • Ví d : CComplex::CComplex(); • Nu ta khơng đ nh ngh ĩa m t constructor nào cho l p, TBD s t đ ng t o m t constructor cho l p, đưc g i là constructor m c đ nh. 3.9.2. Constructor sao chép (copy constructor) • Constructor sao chép ch cĩ m t đ i s , đĩ là tham chi u đ n đ i t ưng cùng l p. • TBD s t o m t constructor sao chép m c đ nh, n u ta khơng đ nh ngh ĩa cho l p mt constructor sao chép. • Constructor sao chép m c đ nh copy đ i t ưng g c t ng bit m t vào đi t ưng mi. • Ví d : CComplex::CComplex( const CComplex & source) { m_dReal = source.m_dReal; m_dImag = source.m_dImag; } 3.9.3. Constructor chuy n ki u (conversion constructor) • Constructor chuy n ki u nh n đ i s cĩ ki u là ki u c n chuy n. • Các constructor chuy n ki u khơng th đưc dùng đ chuy n các ki u c a mình sang l p khác. • Constructor chuy n ki u ch đưc dùng trong các phép gán và kh i đ ng. • Ví d : CComplex::CComplex( int i) { m_dReal = ( double )i; m_dImag = 0; } 3.10. Destructor • Khơng cĩ giá tr tr v • Khơng cĩ đi s . • Tên c a destructor trùng v i tên l p và cĩ d u ngã (~) đng tr ưc • ðưc g i t đ ng khi đ i t ưng b hu b kh i b nh . • Nu ta khơng đ nh ngh ĩa m t destructor cho l p thì trình biên d ch s t sinh cho lp m t destructor m c đ nh khơng làm gì c . • Mt l p ch cĩ m t destructor 3.11. Tốn t gán mc đ nh (default operator =) • Nu ta khơng đ nh ngh ĩa m t tốn t gán cho l p, TBD s t đ ng t o ra m t tốn t gán m c đ nh cho l p. • Tốn t gán m c đ nh th c hi n vi c copy t ng bít m t. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 6
  7. • Câu h i: s khác nhau gi a tốn t gán m c đ nh và constructor sao chép m c đnh? 3.12. S chuy n ki u 3.12.1. S chuy n ki u ng m • ðưc th c hi n b ng constructor chuy n ki u. • TBD t đ ng th c hi n vi c chuy n ki u này. • Constructor chuy n ki u khơng th đưc dùng đ chuy n m t đ i t ưng c a l p mình sang ki u khác. • Ch đưc dùng trong phép gán và kh i đ ng. • Ví d : CComplex::CComplex( int i) { m_nReal = ( double )i; m_nImag = 0; } 3.12.2. S chuy n ki u t ưng minh • ðưc th c hi n b ng tốn t ép ki u (cast operator). • Cĩ th đưc dùng đ chuy n các đ i t ưng sang ki u khác. • Cĩ th đưc dùng cho các m c đích khác ngồi gán và kh i đ ng. • Tốn t chuy n ki u khơng cĩ đ i s và giá tr tr v operator type() Type là tên c a ki u mà đi t ưng s đưc chuy n sang. Ví d : operator int(); Ví d v s chuy n ki u: #include class CMyPoint { public : int m_nX; int m_nY; CMyPoint( int a); // constructor chuy n ki u operator int (); // tốn t ép sang ki u nguyên }; CMyPoint::CMyPoint( int a = 0) // ði s c a constructor chuy n ki u là mt giá tr ki u khác { m_nX = a; m_nY = 0; } Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 7
  8. CMyPoint:: operator int () { return m_nX; } int _tmain( int argc, TCHAR* argv[], TCHAR* envp[]) { CMyPoint A; CMyPoint B(5); CMyPoint C = 6; int i = int (C); std::cout >i; // Dịng này ch đ d ng ch ươ ng trình. } Kt qu s là: A = 0,0 B = 5,0 C = 6,0 i = 6 3.13. ði t ưng t m và lnh g i ph ươ ng th c b gi u Trong đon ch ươ ng trình trên (xem ví d v s chuy n ki u), n u ta th c hi n phép gán sau: A = i; Thì TBD s làm nh ư sau: Temp = CPoint(i); operator = (temp); Bài t p: Thêm tốn t gán, tốn t chuy n sang ki u double, và constructor chuy n ki u vào lp CComplex (xem t trang 1 ti trang 3). 3.14. Lp bao 3.14.1. ðnh ngh ĩa • Lp bao là l p mà cĩ m t ho c nhi u thành ph n d li u c a nĩ là đi t ưng c a mt l p khác. • Ví d : class CSinhVien { int m_nMSSV; char * m_strHoTen; Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 8
  9. CSinhVien(); // } class CDeTai // đây là l p bao vì m_TH là m t đ i t ưng. { char * m_strTenDT; CSinhVien m_TH; // } 3.14.2. Constructor c a l p bao • Constructor c a l p bao ph i bao g m c vi c kh i t o các thành ph n d li u là đi t ưng. Ví d : class A { private : int i; public : A() { i = 0; } }; class B { private : int i; public : B( int x) { i = x; } }; class C { private : A a; B b1; B b2; public : C(): b1(1), b2(5) {} }; • Nu m t thành ph n c a l p bao là m t đ i t ưng mà constructor c a đ i t ưng này địi h i ph i cĩ đ i s thì l p bao b t bu c ph i cĩ m t constructor t ưng minh. Ngay c khi constructor c a l p bao khơng cĩ l nh nào trong thân hàm constructor, nĩ v n ph i đưc đ nh ngh ĩa t ưng minh. ðiu này là đ nh m cĩ các Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 9
  10. đi s cho các constructor c a các đ i t ưng thành ph n. L p bao trong tr ưng hp này khơng cĩ constructor m c đ nh. • Ph n kh i t o các thành ph n đ i t ưng (ph n n m sau d u hai ch m “:”) đưc gi là initiater list . 3.15. Các thành ph n t ĩnh (static) Ví d : class CSinhVien { static int m_nMaLop; string m_nHoTen; public : static bool DaThi(); }; 3.15.1. Thành ph n static là d li u: • Trong tồn b l p, ch cĩ m t th hi n duy nh t c a thành ph n đĩ. • Thành ph n này t n t i ngay c khi l p đĩ khơng cĩ đi t ưng nào. • Các thành ph n bi n static đưc kh i t o bên ngồi đnh ngh ĩa c a l p • Khi kh i t o thành ph n bi n static, ta ph i ch đ nh rõ tên l p và tốn t ph m vi, ví d : int CSinhVien::m_nMaLop = 031135; 3.15.2. Thành ph n static là ph ư ng th c • Mt ph ươ ng th c đưc khai báo là static, s khơng g n v i (liên h v i) m t đ i tưng n (con tr this) nào nh t đ nh. • Mt ph ươ ng th c static c a m t l p cĩ th đưc g i cho dù cĩ t n t i m t đ i tưng c a l p đĩ hay khơng. • Th ưng các ph ươ ng th c static đưc s dng nh m x lý nh ng cơng vi c chung cho tồn b l p (cho t t c các đ i t ưng c a l p). • Khơng th truy c p đưc vào các thành ph n khơng static trong m t ph ươ ng th c static. • ð g i m t ph ươ ng th c static, ta th c hi n m t trong hai cách gi sau đây: CSinhVien::DaThi(); Ho c: CSinhVien Hung; Hung.DaThi(); Các ph ươ ng th c static khơng c n g n v i m t đ i t ưng c th , nên s d ng d ng đ u s tr c quan h ơn d ng th 2. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 10
  11. 3.16. Các đi t ưng đưc c p phát đ ng • Các đi t ưng cĩ th đưc c p phát đ ng trong heap như các ph n t d li u khác. • ð truy xu t các thành ph n c a đ i t ưng qua con tr , ta dùng tốn t ->. • Ví d : int main() { CComplex *c = new CComplex; c->m_dImag = 1; c->m_dReal = 2; c->Xuat(); delete c; } 3.17. ðnh ngh ĩa l i (overload) new và delete • Mt l p cĩ th đ nh ngh ĩa l i các tốn t new và delete cho riêng nĩ. • Nu cĩ m t đ i t ưng đ ng đưc t o ra, và l p đĩ cĩ đ nh ngh ĩa các tốn t new và delete thì các tốn t new và delete c a l p đĩ s đưc g i (thay vì g i các tốn t new và delete m c đ nh). • Prototype c a tốn t new và delete nh ư sau: void * operator new (size_t size); void operator delete (void * p); void * operator new[] (size_t size); void operator delete[] (void * p); • Ví d : class A { public : void * operator new (size_t size); // các thành ph n khác }; void * A:: operator new (size_t size) { cout<< "tốn t new do ng ưi l p trình đnh ngh ĩa" ; return :: operator new (size); //g i t.t new m c đ nh } int main() { A *p = new A(); // Tốn t new trong l p A đưc g i // } 3.18. Mng các đ i t ưng • Khi khai báo m t m ng các đ i t ưng, constructor s đưc g i cho m i đ i t ưng ca m ng. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 11
  12. • Cĩ 2 cách kh i đ ng giá tr cho m ng các đ i t ưng. o Dùng constructor m c đ nh (khơng cĩ đ i s ). Ví d : class CPoint { private : int m_nX; int m_nY; public : void PrintMe(); }; int main() { CPoint Array[100]; //M ng 100 object thu c l ơp CPoint // M i object trong m ng đưc kh i đ ng b ng // cách g i constructor m c đ nh. for (int i = 0; i < 100; i++) Array[i].PrintMe(); } o Dùng constructor cĩ đi s . Ví d : class CPoint { private : int m_nX; int m_nY; public : CPoint( int x, int y); void PrintMe(); }; int main() { CPoint Array[3] = {CPoint(1, 2), CPoint(3, 4), CPoint(4, 6)}; for (int i = 0; i < 3; i++) Array[i].PrintMe(); } 3.19. Các đi t ưng là h ng (const) • Cũng nh ư các ph n t d li u khác, m t đ i t ưng cĩ th đưc khai báo là h ng s b ng t khố const. Ví d : const CPoint P; • Các đi t ưng const khơng b thay đ i các thành ph n d li u. • Ch cĩ các ph ươ ng th c h ng , constructor, destructor m i cĩ th đưc g i trên các đi t ưng const (constructor và destructor đưc g i khơng t ưng minh). Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 12
  13. • Ph ươ ng th c h ng là ph ươ ng th c cĩ t khố const đ ng sau danh sách đ i s trong prototype c a ph ươ ng th c. • Ví d , n u khai báo m t đ i t ưng h ng P thu c l p CPoint nh ư sau, thì các ph ươ ng th c SetX() và SetY() s khơng đưc phép g i trên đi t ưng P: class CPoint { private : int m_nX; int m_nY; public : CPoint( int x, int y); void PrintMe() const ; // Ph ươ ng th c h ng. void SetX( int x); void SetY( int y); }; int main() { const CPoint P; // ði t ưng h ng. P.PrintMe(); // ðưc vì PrintMe() là ph ươ ng th c h ng P.SetX(); // Khơng đưc p.SetY(); // Khơng đư oc } 3.20. Hàm b n và l p b n • Mt l p cĩ th cho phép các hàm ho c các l p khác truy xu t đn các thành ph n private c a nĩ. • Các hàm cĩ th truy xu t vào vùng private c a m t l p đưc g i là hàm b n ca lp đĩ. • Các l p cĩ th truy xu t vào vùng private c a m t l p đưc g i là lp b n ca lp đĩ. • Ta dùng t khố friend đ ch đ nh hàm b n ho c l p b n. • Mt l p b n ph i đưc khai báo tr ưc khi nĩ đưc ch đ nh là l p b n. • Vi c ch đ nh m t friend cĩ th n m trong ph n private, public ho c protected c a lp. • Ví d v hàm b n: class A { private : int x; int y; public : friend void Func(A a); }; void Func(A a) { //cĩ th truy xu t vào các t.ph n private đây. a.x = 1; a.y = 2; Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 13
  14. } • Ví d v l p b n: class A; // Khai báo tr ưc khi xác đ nh A là b n c a B class B { private : int a; int b; public : friend class A; }; class A { // Trong l p A, cĩ th truy xu t các th.ph n private // c a l p B. int m_X; int m_Y; public: void SetX(B b) { m_X = b.a; // truy xu t tp private c a l p B } void SetY(); }; void A::SetY(B b) { m_Y = b.b; // truy xu t tph n private c a l p B } Bài t p: Hãy đnh ngh ĩa ch ng (overload) tốn t c ng đ co th th c hi n đưc bi u th c sau : CComplex a, b; b = 3 - a; 3.21. Con tr this • Câu h i 1: gi i thích s ho t đ ng trong tốn t c ng c a l p CComplex, đâu là tốn h ng th nh t, đâu là tốn h ng th 2 . • Câu h i 2 : Gi s ta cĩ m t hàm nh ư sau (tham kh o l p CComplex trang 1) : void Print(CComplex *p) { // Gi s m_dReal va m_dImag là các thành ph n public printf( "(%g, %g)" , p->m_dReal, p->m_dImag); } Hãy vi t l i ph ươ ng th c PrintMe c a l p CComplex b ng cách s d ng hàm trên đây . Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 14
  15. • Câu h i 3 : ðiu gì x y ra trong đon ch ươ ng trình sau : class CPoint { private : int x; int y; public : void SetPoint( int x, int y); }; void CPoint::SetPoint( int x, int y) { x = x; y = y; } • Khi g i m t ph ươ ng th c c a m t l p, đ i s đu tiên đưc g i đ n ph ươ ng th c này là m t con tr tr t i đ i t ưng mà trên đĩ ta th c hi n vi c g i ph ươ ng th c. Con tr này đưc g i là con tr this . • Ta cĩ th dùng con tr này đ truy xu t các thành ph n c a đ i t ưng, ví d : class CPoint { private : int x; int y; public : void SetPoint( int x, int y); }; void CPoint::SetPoint( int x, int y) { this ->x = x; this ->y = y; } 3.22. T ch c t p tin c a m t ch ươ ng trình C++ • Trong ví d v l p CComplex đ u ch ươ ng, ta th y ch ươ ng trình g m 3 file v i ch c n ăng nh ư sau: o File đnh ngh ĩa l p (complex.h): file này ch a ph n đ nh ngh ĩa c a l p. o File đnh ngh ĩa các ph ươ ng th c c a l p (complex.cpp): file này đưc xem nh ư ph n cài đt c a m t l p, ch a t t c các đ nh ngh ĩa c a các ph ươ ng th c trong l p. N u m t l p cĩ quá nhi u ph ươ ng th c, ta cĩ th dùng nhi u file .cpp đ ch a đ nh ngh ĩa các ph ươ ng th c. Trong file này, ta ph i include file ch a đ nh ngh ĩa l p (complex.h). o File s d ng l p (main.cpp): file này ch a hàm main, trong hàm này ta khai báo các đi t ưng thuc l p và s d ng các l p đã đưc t o ra. Trong file này, ta ph i include file ch a đ nh ngh ĩa l p (complex.h). • ð tránh vi c include 1 file 2 ho c nhi u l n, ta dùng gi i pháp sau (xem ví d v lp CComplex): Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 15
  16. #ifndef ___XXXX.H #define ___XXXX.H // Ph n đnh ngh ĩa l p đây. #endif • Sinh viên hãy gi i thích c ơ ch làm vi c này nh ư m t bài t p. 3.23. T khố extern • Ta dùng kh i extern “C”{ } (xem ví d đ u ch ươ ng) đ báo cho trình biên dch C++ r ng hãy d ch nh ng hàm cĩ prototype n m trong kh i extern theo ki u C chu n. • Mc đích là đ cĩ th s d ng l i nh ng th ư vi n đưc vi t b ng C trong m t ch ươ ng trình C++. 3.24. namespace • Khái ni m namespace trong C++ đưc đưa ra nh m m c đích gi i quy t s đ ng đ trong vi c s d ng các tên bi n ho c tên hàm. Ví d trong đon code c a ta cĩ mt hàm tên là Func, và n u ch ươ ng trình c a ta s d ng m t th ư vi n mà trong th ư vi n đĩ c ũng cĩ m t hàm tên là Func, điu này s d n đ n vi c đ ng đ v tên hàm, khi n ta khơng th ch cho trình biên d ch bi t đưc ta đang mu n s d ng hàm nào trong 2 hàm đĩ. V n đ này co th gi i quy t đưc b ng cách s d ng khái ni m namespace. • ð gi i quy t tình hu ng trên, ta cĩ th đ t code c a ta trong m t namespace, ví d: //namespace.h namespace mycode { void Func(); } Và implement hàm Func() trong namespace này, ví du, nh ư sau: // namespace.cpp #include #include "namespace.h" namespace mycode { void Func() { std::cout<< "This is an example of namespace" ; } } Bng cách đ t code c a ta trong m t namespace, ta cách ly tên hàm c a ta trong mt ph m vi riêng, nh đĩ gi i quy t đưc s trùng tên. Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 16
  17. • ð th c hi n vi c g i hàm, ta cĩ th dùng m t trong 2 cách sau: mycode::Func(); // đt tên namespace tr ưc tên hàm Ho c: // usingnamespace.cpp #include "namespace.h" using namespace mycode; int main() { Func(); // implies: mycode::Func(); } Biên so n: ð ng Thanh D ũng, khoa CNTT - ðH SPKT TP.HCM 17