Ngôn ngữ lập trình C và C++ - Bài 6: Cấu trúc và lớp - Đỗ Đăng Khoa

Tài liệu Ngôn ngữ lập trình C và C++ - Bài 6: Cấu trúc và lớp - Đỗ Đăng Khoa: 5/12/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngôn ngữ lập trình C và C++ Bài 6: Cấu trúc và Lớp TS. Đỗ Đăng Khoa Bộ môn Cơ học Ứng dụng Viện Cơ khí 5/12/2015 2 Khái niệm về Cấu trúc (Struct) Một tập hợp của một hoặc nhiều biến, có thể khác kiểu nhau, được nhóm lại dưới một tên duy nhất cho tiện xử lý Trong các ứng dụng về cơ sở dữ liệu, kiểu cấu trúc còn được gọi là bản ghi Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Hồ sơ nhân viên: mỗi nhân viên được mô tả bởi một tập các thuộc tính như: tên, địa chỉ, số CMT, lươngM. Một trong số các thuộc tính này lại có thể là một cấu trúc: tên có thể có vài thành phần (họ, tên đệm, tên), địa chỉ và lương cũng có thể như vậy Tài khoản ngân hàng: tên chủ tài khoản, tên tài khoản, số dư tài khoản, loại tiền 5/12/2015 3 Khai báo cấu trúc Khai báo một cấu trúc struct { các thành phần ; } ; Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI struct point { int x; int y; ...

pdf63 trang | Chia sẻ: putihuynh11 | Lượt xem: 684 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Ngôn ngữ lập trình C và C++ - Bài 6: Cấu trúc và lớp - Đỗ Đăng Khoa, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
5/12/2015 1 TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ngơn ngữ lập trình C và C++ Bài 6: Cấu trúc và Lớp TS. Đỗ Đăng Khoa Bộ mơn Cơ học Ứng dụng Viện Cơ khí 5/12/2015 2 Khái niệm về Cấu trúc (Struct) Một tập hợp của một hoặc nhiều biến, cĩ thể khác kiểu nhau, được nhĩm lại dưới một tên duy nhất cho tiện xử lý Trong các ứng dụng về cơ sở dữ liệu, kiểu cấu trúc cịn được gọi là bản ghi Việc định nghĩa cấu trúc sẽ tạo ra kiểu dữ liệu mới Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Hồ sơ nhân viên: mỗi nhân viên được mơ tả bởi một tập các thuộc tính như: tên, địa chỉ, số CMT, lươngM. Một trong số các thuộc tính này lại cĩ thể là một cấu trúc: tên cĩ thể cĩ vài thành phần (họ, tên đệm, tên), địa chỉ và lương cũng cĩ thể như vậy Tài khoản ngân hàng: tên chủ tài khoản, tên tài khoản, số dư tài khoản, loại tiền 5/12/2015 3 Khai báo cấu trúc Khai báo một cấu trúc struct { các thành phần ; } ; Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI struct point { int x; int y; }a,b,c; 5/12/2015 4 Khai báo cấu trúc Mỗi thành phần giống như một biến riêng của kiểu, nĩ gồm kiểu và tên thành phần. Một thành phần cũng cịn được gọi là trường. Phần tên của kiểu cấu trúc và phần danh sách biến cấu trúc cĩ thể cĩ hoặc khơng. Tuy nhiên trong khai báo kí tự kết thúc cuối cùng phải là dấu chấm phẩy (;). TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Các kiểu cấu trúc được phép khai báo lồng nhau, nghĩa là một thành phần của kiểu cấu trúc cĩ thể lại là một trường cĩ kiểu cấu trúc. Một biến cĩ kiểu cấu trúc sẽ được phân bố bộ nhớ sao cho các thực hiện của nĩ được sắp liên tục theo thứ tự xuất hiện trong khai báo. 5/12/2015 5 Khai báo biến kiểu cấu trúc Khai báo ngay sau dấu ngoặc }, danh sách các biến; struct { ... } x, y, z; Khai báo như biến thơng thường (trong C) struct TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Khai báo như biến thơng thường (trong C++) ; 5/12/2015 6 Khởi tạo biến cấu trúc Khởi tạo ngay định nghĩa của nĩ với danh sách các khởi tạo cho các thành phần point pt = {10, 20}; Sử dụng tốn tử gán point pt1 = {10, 20}, pt2; pt2 = pt1; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ví dụ: struct rect { point p1,p2; }; rect rect1={{1,2},{3,4}}; 5/12/2015 7 Truy cập đến thành phần của cấu trúc Biến khơng phải con trỏ tên_cấu_ trúc.thành_phần Biến con trỏ: tên_cấu_ trúc->thành_phần, (*tên_cấu_trúc).thành_phần Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI In tọa độ điểm pt: printf("%d,%d", pt.x, pt.y); //Tính khoảng cách từ pt đến tọa độ: Double dist = sqrt((double)pt.x * pt.x + (double)pt.y * pt.y); 5/12/2015 8 Cấu trúc lồng nhau Hình chữ nhật là một cặp điểm xác định hai gĩc đối diện. struct rect { point pt1; point pt2; }; Nếu khai báo screen là TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI rect screen; thì screen.pt1.x chỉ đến tọa độ x của thành phần pt1 của screen. 5/12/2015 9 Hàm và Cấu trúc Các thao tác hợp lệ duy nhất với một cấu trúc là  Sao chép nĩ hoặc gán cho nĩ,  Lấy địa chỉ qua &, Truy xuất các thành phần của nĩ. Việc sao chép và gán bao gồm TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Truyền đối số tới hàm Trả giá trị từ hàm 5/12/2015 10 Hàm và Cấu trúc Hàm trả về một cấu trúc là một biến cấu trúc. là một con trỏ cấu trúc. là một tham chiếu cấu trúc.  Ví dụ hàm trả về biến cấu trúc struct Sophuc// Khai báo kiểu số phức dùng chung TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI { float thuc; float ao; }; 5/12/2015 11 Hàm và Cấu trúc Sophuc Cong(Sophuc x, Sophuc y) { Sophuc kq; kq.thuc = x.thuc + y.thuc ; kq.ao = x.ao + y.ao ; return kq; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI } void In(Sophuc x) { cout << "(" << x.thuc << "," << x.ao << ")" << endl ; } 5/12/2015 12 Hàm và Cấu trúc void main(){ Sophuc x, y; cout > x.thuc >> x.ao ; cout > y.thuc >> y.ao ; cout << "x + y = " ; In(Cong(x,y)) ;} Ví dụ hàm trả về con trỏ cấu trúc TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Sophuc* Tru(Sophuc x, Sophuc y){ Sophuc* kq=new Sophuc; kq->thuc = x.thuc + y.thuc ; kq->ao = x.ao + y.ao ; return kq; } 5/12/2015 13 Hàm và Cấu trúc Hàm cĩ đối số là cấu trúc Là một biến cấu trúc Là một con trỏ cấu trúc Là một tham chiếu cấu trúc Là một mảng cấu trúc hình thức hoặc con trỏ mảng TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Trường hợp cấu trúc lớn, sử dụng con trỏ và tham chiếu sẽ hiệu quả hơn việc phải sao chép cả cấu trúc. Con trỏ cấu trúc tương tương tự như con trỏ tới các biến thơng thường. 5/12/2015 14 Bảng (Mảng) Cấu trúc Khai báo: struct_name {} tenbang[kích_thước]; struct_name tenbang[kích_thước]; Khởi tạo: M = {,,,} hoặc ..={{,,},{,,},M} Truy cập: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI tenbang[i] Ví dụ: //mảng mười biến kiểu point point a[10]; 5/12/2015 15 Con trỏ Cấu trúc Khai báo: struct_name * ten_con_tro; Khởi gán thơng qua phép lấy địa chỉ & Ví dụ: point p1={1,2}, *p2; p2=&p1; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Cấp phát động và thu hồi bộ nhớ cũng thơng qua: new và delete Ví dụ: point *p1=new point; delete p1; int n=10; point *p2=new point[n]; delete []p2; 5/12/2015 16 Kiểu Hợp Kiểu hợp cũng cĩ nhiều thành phần giống kiểu cấu trúc Tuy nhiên, các thành phần của chúng sử dụng chung nhau một vùng nhớ Kích thước của một kiểu hợp là độ dài của trường lớn nhất và việc Thay đổi giá trị một thành phần sẽ ảnh hưởng đến tất cả các TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI thành phần cịn lại Ví dụ: union { Danh sách các thành phần; }; 5/12/2015 17 Truy cập đến thành phần của hợp Biến khơng phải con trỏ tên_cấu_ trúc.thành_phần Biến con trỏ: tên_cấu_ trúc->thành_phần, (*tên_cấu_trúc).thành_phần Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI union foo { int x; int y; }; foo f; f.x = 10; /* cũng mang giá trị 10 vì dùng chung bộ nhớ với f.x */ printf("%d\n", f.y); 5/12/2015 18 Từ Khĩa typedef Một kiểu dữ liệu cĩ thể được định nghĩa bằng cách sử dụng từ khĩa typedef Nĩ khơng tạo ra một kiểu dữ liệu mới, mà định nghĩa một tên mới cho một kiểu đã cĩ. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Cú pháp: typedef type tên; Ví dụ: typedef float deci; 5/12/2015 19 Lập trình hướng đối tượng Đối tượng: là một đơn vị đầy đủ được kết hợp bởi các dữ liệu và chỉ thị Đối tượng được chia thành hai thành phần: các phương thức (hàm) và các thuộc tính (biến) Phương thức: là phương tiện để sử dụng đối tượng, TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI trong khi các thuộc tính sẽ mơ tả đối tượng cĩ tính chất gì Đối tượng được trừu tượng hĩa qua việc định nghĩa của các lớp 5/12/2015 20 Các đặc tính của lập trình hướng đối tượng Tính trừu tượng (abstraction): Bỏ qua một số khía cạnh thơng tin, chỉ tập trung vào những cốt lõi cần thiết Mỗi đối tượng cĩ thể hồn tất các cơng việc một cách nội bộ, báo cáo, thay đổi trạng thái của nĩ và liên lạc với các đối tượng khác, khơng cần cho biết làm cách nào tiến hành TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI được các thao tác (trừu tượng dự liệu) Tính trừu tượng cịn thể hiện qua việc một đối tượng ban đầu cĩ thể cĩ một số đặc điểm chung cho nhiều đối tượng khác như là sự mở rộng của nĩ nhưng bản thân đối tượng này cĩ thể khơng cĩ các biện pháp thi hành (lớp trừu tượng hay lớp cơ sở) 5/12/2015 21 Các đặc tính của lập trình hướng đối tượng Tính đĩng gĩi (encapsulation) và che giấu thơng tin (information hiding): Tính chất này khơng cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng Chỉ cĩ các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nĩ TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Tính đa hình (polymorphism): Thơng qua việc gửi các thơng điệp (message) Các phương thức dùng trả lời cho một thơng điệp sẽ tùy theo đối tượng mà thơng điệp đĩ được gửi tới sẽ cĩ phản ứng khác nhau 5/12/2015 22 Các đặc tính của lập trình hướng đối tượng Tính kế thừa (inheritance): Cho phép một đối tượng cĩ thể cĩ sẵn các đặc tính mà đối tượng khác đã cĩ thơng qua kế thừa Cho phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn cĩ mà khơng phải tiến hành định nghĩa lại TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Khơng phải ngơn ngữ hướng đối tượng nào cũng cĩ tính chất này. 5/12/2015 23 Khái niệm về lớp (Class) Một lớp bao gồm các hàm và dữ liệu cĩ liên quan Các hàm này là các hàm thành phần (member function) hay cịn là phương thức (method) TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Giống như cấu trúc, lớp cĩ thể xem như một kiểu dữ liệu Từ một lớp cĩ thể tạo ra (bằng cách khai báo) nhiều đối tượng (biến, mảng) khác nhau. Mỗi đối tượng cĩ vùng nhớ riêng của mình 5/12/2015 24 Khai báo lớp (Class) Cú pháp: class tên_lớp { đặc_tả_truy_cập_1: member1; đặc_tả_truy_cập_2: member2; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ... }danh_sách_đối_tượng; Ví dụ: class CRectangle { int x, y; public: int area (void);} rect; 5/12/2015 25 Khai báo lớp (Class) Việc khai báo một lớp khơng chiếm giữ bộ nhớ, chỉ các đối tượng của lớp mới thực sự chiếm giữ bộ nhớ. Thuộc tính của lớp cĩ thể là các biến, mảng, con trỏ cĩ kiểu chuẩn (int, float, char, char*, long,...) TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Thuộc tính của lớp cĩ thể là kiểu ngồi chuẩn đã định nghĩa trước (struct, union, class,...) Thuộc tính của lớp khơng thể cĩ kiểu của chính lớp đĩ, nhưng cĩ thể là con trỏ của lớp này 5/12/2015 26 Khai báo lớp (Class)- Các đặc tả truy cập Các đặc tả truy cập này thay đổi các quyền truy cập mà các thành phần khai báo sau chúng cĩ được: private: chỉ cĩ thể truy cập từ bên trong thành phần cùng lớp đĩ (trong thân các phương thức của lớp) hoặc từ các thành phần bạn (friend) của nĩ. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI protected: như private, ngồi ra cịn từ các thành phần của các lớp dẫn xuất (lớp con) của lớp đĩ. public: cĩ thể truy cập từ mọi nơi mà đối tượng hiển thị. Mặc định của class là quyền truy cập private đối với tất cả thành phần của nĩ 5/12/2015 27 Khai báo lớp (Class)- Các đặc tả truy cập Nếu các thành phần dữ liệu đã khai báo là private thì các hàm thành phần phải cĩ ít nhất một vài hàm được khai báo dạng public để cĩ thể truy cập được, nếu khơng tồn bộ lớp sẽ bị đĩng kín và điều này khơng giúp gì cho chương trình TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Cách khai báo lớp tương đối phổ biến là các thành phần dữ liệu được ở dạng private và hàm thành phần dưới dạng public 5/12/2015 28 Khai báo lớp (Class)- Dữ liệu thành phần Khai báo như khai báo các thành phần trong kiểu cấu trúc hay hợp Bình thường được khai báo là private để bảo đảm tính giấu kín, bảo vệ an tồn dữ liệu của lớp khơng cho phép TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI các hàm bên ngồi xâm nhập vào các dữ liệu này. Khơng được khai báo là auto, register hoặc extern Kiểu: enum, kiểu dữ liệu cĩ sẵn (chuẩn) hoặc người dùng định nghĩa (struct, union, class) 5/12/2015 29 Khai báo lớp (Class)- Hàm thành phần Hàm thành phần dùng để truy cập cĩ kiểm sốt vào thành phần dữ liệu của lớp Thường khai báo là public để chúng cĩ thể được gọi tới (sử dụng) từ các hàm khác trong chương trình TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Hàm khai báo là private chỉ cĩ thể được gọi bởi các hàm public khác trong lớp Bản mẫu hàm: được khai báo bên trong phần thân lớp. 5/12/2015 30 Định nghĩa lớp (Class)- Hàm thành phần Định nghĩa hàm: cĩ thể được triển khai luơn trong thân lớp hoặc bên ngồi lớp cùng tốn tử phạm vi :: (kiểu_trả_về tên_lớp::tên_hàm()) TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Hàm được định nghĩa bên trong lớp sẽ được tự động coi là hàm thành phần inline bởi trình biên dịch Hàm thành phần được phép truy xuất tới các dữ liệu thành phần, kể cả dữ liệu kiểu private 5/12/2015 31 Định nghĩa lớp (Class)- Hàm thành phần Ví dụ: #include #include class point{ private: int x, y, m ; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI public: void inputdata() ; void displaypoint() ; //Hiện một điểm //Ẩn một điểm, hàm định nghĩa trong khai báo void hidepoint() { putpixel(x, y,getbkcolor()); } }; 5/12/2015 32 Định nghĩa lớp (Class)- Hàm thành phần void point::inputdata(){ cout <<"\n Nhap hoanh do va tung do cua diem:”; cin >> x >> y ; cout << “\n Nhap ma mau cua diem: “; cin >> m ; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI void point::displaypoint(){ int mau_ht ; mau_ht = getcolor(); putpixel(x, y, m); setcolor(mau_ht); } 5/12/2015 33 Phạm vi lớp Ngồi hai phạm vi tồn cục và cục bộ, C++ đưa ra khái niệm về phạm vi lớp Mọi thành phần của lớp được gọi là trong phạm vi của lớp đĩ Mọi thành phần của lớp đều cĩ thể tham khảo tới bất kì thành phần nào khác của cùng lớp TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Các hàm thành phần của lớp cĩ quyền truy cập khơng hạn chế vào thành phần dữ liệu của lớp đĩ Việc truy cập vào các thành phần dữ liệu và hàm từ ngồi phạm vi lớp do người lập trình kiểm sốt 5/12/2015 34 Đối tượng, Mảng và con trỏ đối tượng của lớp Một đối tượng (object) là một thể nghiệm của lớp Lớp là một định nghĩa của đối tượng. Chú ý: Lớp là một kiểu dữ liệu, đối tượng của lớp này chỉ là một biến. Ví dụ: point a; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Cách khai báo mảng đối tượng, con trỏ đối tượng cũng giống như khai báo biến, mảng các kiểu khác (như int, float, struct, union,...) Ví dụ: point b[10], *c; c= new point; 5/12/2015 35 Truy xuất thuộc tính của đối tượng Mỗi thuộc tính đều thuộc về một đối tượng, khơng thể viết tên thuộc tính một cách riêng rẽ mà bao giờ cũng phải cĩ tên đối tượng đi kèm Truy xuất thuộc tính của đối tượng bằng tốn tử chấm . tên_đối_tượng.Tên_thuộc_tính con_trỏ_đối_tượng->Tên_thuộc_tính TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Ví dụ: point a,*b; a.x;// chỉ dùng được trong hàm thành phần b=&a; b->y; // chỉ dùng được trong hàm thành phần Chỉ cĩ thể truy xuất thuộc tính private của đối tượng bằng các hàm thành phần 5/12/2015 36 Sử dụng hàm thành phần của đối tượng Cũng giống như hàm thơng thường, hàm thành phần được sử dụng thơng qua lời gọi.  Tuy nhiên trong lời gọi hàm thành phần bao giờ cũng phải cĩ tên đối tượng để chỉ rõ hàm thực hiện trên các thuộc tính của đối tượng nào. Ví dụ: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI void main(){ point a; a.inputdata(); } 5/12/2015 37 Đối của hàm thành phần, con trỏ this Con trỏ this là con trỏ tới chính đối tượng của nĩ Con trỏ this là đối thứ nhất của hàm thành phần Các thuộc tính viết trong hàm inputdata() gọi bởi một đối tượng được hiểu là thuộc chính đối tượng đĩ do con trỏ this trỏ tới Cách viết tường minh lại hàm inputdata() TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI void point::inputdata(){ cout <<"\n Nhap hoanh do va tung do cua diem:”; cin >> this->x >>this-> y ; cout << “\n Nhap ma mau cua diem: “; cin >> this->m ; } 5/12/2015 38 Đối của hàm thành phần, con trỏ this Tham số truyền cho đối con trỏ this chính là địa chỉ của đối tượng đi kèm với phương thức trong lời gọi phương thức Ví dụ: point a; a.inputdata() Trong trường hợp này tham số truyền cho con trỏ this chính TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI là địa chỉ của a: this = &a Con trỏ this cịn được dùng trong các hàm thành phần cần trả lại chính đối tượng cĩ phương thức đang triển khai. 5/12/2015 39 Đối tượng hằng và các hàm thành phần hằng Đối tượng hằng là đối tượng được khai báo với từ khố cons Mọi ý định sửa đổi các đối tượng hằng đều bị chương trình báo lỗi khi biên dịch Các hàm thành phần "khơng sủa đổi dữ liệu của lớp", tức là các hàm thành phần hằng và là các hàm được khai báo với từ khố const, mới được phép thực hiện trên các đối tượng hằng TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Khi viết các hàm thành phần của lớp, cần xác định ngay hàm nào cần sửa hàm nào khơng cần sửa đổi dữ liệu của lớp và đặt thêm từ khố const tương ứng trong khai báo và định nghĩa hàm. 5/12/2015 40 Đối tượng hằng và các hàm thành phần hằng Ví dụ: class Matrix{ int row,col; double data[100][100]; public: void Transpose(); TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI double Det() const; // hàm thành phần hằng }; int main(){ Matrix const m; m.Transpose(); // error // OK vì Det() là hàm thành phần hằng double d = m.Det(); } 5/12/2015 41 Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử Các đối tượng cần được khởi tạo dữ liệu thành phần hoặc gán bộ nhớ động trong quá trình sinh ra để tránh việc trả lại các giá trị khơng mong muốn trong quá trình thao tác chúng Hàm dựng cũng là một hàm thành phần của lớp (nhưng là hàm đặc biệt) được tự động gọi bất cứ khi nào một đối tượng mới của lớp này được tạo ra TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘ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 dựng Hàm dựng sẽ khởi gán giá trị cho 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. 5/12/2015 42 Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử Hàm dựng phải cĩ tên giống tên lớp, khơng cĩ giá trị trả về (kể cả void). Nếu khơng định nghĩa hàm dựng của một lớp, trình biên dịch sẽ sinh ra hàm dựng ngầm định. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Hàm dựng ngầm định khơng cĩ đối và chỉ đơn thuần đặt khơng vào mọi byte của biến thể nghiệm của một đối tượng Một lớp cĩ thể cĩ nhiều hơn một hàm dựng (cùng tên, khác bộ đối số) 5/12/2015 43 Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử class point { private: int x,y,m; public: point()// hàm dựng khơng đối TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI {x=0; y=0; m=1;} //hàm dựng cĩ đối point(int x1, int y1, int m1); }; 5/12/2015 44 Định nghĩa lớp- Hàm dựng (tạo)/ Cấu tử point :: point(int x1, int y1, int m1) {x = x1; y = y1; m = m1; } Ví dụ: point a; // Gọi tới hàm dựng khơng đối. // Kết quả a.x = 0, a.y = 0, a.m = 1 point b(300, 100, 5);// Gọi tới hàm dựng cĩ đối. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI // Kết quả b.x = 300, b.y = 100, b.m = 5 point c[5] ;// Gọi tới hàm dựng khơng đối 5 lần  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 dựng 5/12/2015 45 Định nghĩa lớp- Hàm dựng sao chép Một hàm dựng tạo ra đối tượng mới từ đối tượng đã cĩ được gọi là hàm dựng sao chép. Hàm dựng sao chép chỉ cĩ một đối: tham khảo tới một đối tượng thuộc cùng lớp Ví dụ: point::point(const point& source) TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI { x= source.x; y= source.y; m= source.m; } 5/12/2015 46 Định nghĩa lớp- Hàm dựng sao chép Nếu khơng được định nghĩa, trình biên dịch sẽ tạo ra cấu tử sao chép ngầm định. Cấu tử này sao đối tượng nguồn theo từng bit sang đối tượng mới. Hàm dựng sao chép trong ví dụ trên khơng khác gì hàm dựng sao chép mặc định. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI  Khi lớp cĩ các thuộc tính con trỏ hoặc tham chiếu, thì hàm dựng sao chép mặc định chưa đáp ứng được yêu cầu (ví dụ sao chép mặc định hai con trỏ của 2 đối tượng thì hai đối tượng dùng chung bộ nhớ con trỏ-> hai đối tượng khơng độc lập). 5/12/2015 47 Định nghĩa lớp- Tốn tử gán = Nếu khơng định nghĩa tốn tử này, trình biên dịch sẽ sinh ra tốn tử gán mặc định. Tốn tử mặc định này sẽ sao chép từng bit từ nơi nguồn sang nơi nhận. Hàm dựng sao chép tạo ra đối tượng mới trong khi tốn tử gán chỉ thay đổi giá trị của đối tượng hiện cĩ. TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI point& point::operator=(const point& source){ if (this != &source) { x= source.x; y = source.y; m=source.m; } } 5/12/2015 48 Định nghĩa lớp- Hàm hủy/ Hủy tử Hàm hủy thực hiện chức năng ngược lại với hàm dựng Tự động gọi khi đối tượng bị hủy, hoặc do kết thúc phạm vi tồn tại của nĩ hoặc do được cấp phát động và được giải phĩng bằng delete Hủy tử phải cĩ tên giống tên lớp, nhưng cĩ thêm dấu ~ phía trước, khơng cĩ đối số và khơng cĩ kiểu trả về (kể cả void). TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI point ::~ point() { } Nếu khơng định nghĩa hàm hủy, thì một hàm hủy mặc định khơng làm gì cả được phát sinh. Đối với nhiều lớp thì hàm hủy mặc định là đủ, và khơng cần đưa vào một hàm hủy mới 5/12/2015 49 Các lớp được định nghĩa với struct và union Các lớp cĩ thể định nghĩa bằng các từ khĩa struct và union. Chỉ cĩ một sự khác nhau là các thành phần của lớp được khai báo với struct và union cĩ quyền truy cập mặc định là public. Với union, nĩ chỉ chứa một thành phần dữ liệu tại một thời TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI điểm. 5/12/2015 50 Quá tải/ Nạp chồng/ Định nghĩa lại các tốn tử Cú pháp: type operator sign (parameters) { /*...*/ } Ví dụ: point operator=(point a); point operator + (point a); point operator - (point a); TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 5/12/2015 51 Quá tải/ Nạp chồng/ Định nghĩa lại các tốn tử Khi nạp chồng tốn tử cần chú ý xem tốn tử là một ngơi (unary) hay hai ngơi (binary). Tốn tử một ngơi thì danh sách rỗng Tốn tử hai ngơi thì danh sách cĩ một tham số Tốn tử () cĩ thể cĩ số tham số tuỳ ý Những tốn tử sau khơng thể nạp chồng TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 5/12/2015 52 Một số điểm lưu ý về lớp Hàm dựng và hàm hủy đặc biệt quan trọng với những lớp cĩ thành phần dữ liệu con trỏ sử dụng cấp phát bộ nhớ động và mảng bởi đây là các thành phần khơng được khởi tạo, sao chép hay giải toả tự động đúng.  Để chúng cĩ thể hoạt động được, tối thiểu phải triển TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI khai: Hàm dựng mặc định  Hàm dựng sao chép Hàm hủy Ngồi ra để dễ sử dụng, nên triển khai tốn tử gán (operator = ()). 5/12/2015 53 Ví dụ về lớp véc tơ class Vector { private: double * m_pData; int m_nSize; public: TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Vector(); Vector(int n); Vector(const double& val, int n); Vector& operator=(const Vector& va); ~Vector(); 5/12/2015 54 Ví dụ về lớp véc tơ double& operator[](int n); Vector operator+(const Vector& x); Vector operator-(const double& x); }; Vector::Vector() TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI { m_nSize = 0; m_pData = 0; // Giong nhu m_pData = NULL; } 5/12/2015 55 Ví dụ về lớp véc tơ Vector::Vector(int n){ m_nSize = n; m_pData = new double[m_nSize]; for (int i = 0; i < m_nSize; i++) m_pData[i] = 0.0; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Vector::Vector(const double& val, int n){ m_nSize = n; m_pData = new double[m_nSize]; for (int i = 0; i < m_nSize; i++) m_pData[i] = val; } 5/12/2015 56 Ví dụ về lớp véc tơ Vector::~Vector(){ delete [] m_pData; // Chú ý dẫu [] } Vector& Vector::operator=(const Vector& va) { delete [] m_pData; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI this->m_nSize = va.m_nSize; this->m_pData = new double [m_nSize]; for (int i = 0; i < m_nSize; i++) this->m_pData[i] = va.m_pData[i]; return *this; } 5/12/2015 57 Ví dụ về lớp véc tơ double& Vector::operator[](int i) { return m_pData[i]; } Vector Vector::operator+(const Vector& x) { TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Vector t(this->m_nSize); for (int i = 0; i < m_nSize; i++) t.m_pData[i] = this->m_pData[i]+x.m_pData[i]; return t; } 5/12/2015 58 Ví dụ về lớp véc tơ Vector Vector::operator-(const double& x){ Vector t(this->m_nSize); for (int i = 0; i < m_nSize; i++) t.m_pData[i] = this->m_pData[i]-x; return t; } TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI int main(){ Vector v; // Constructor mặc định được gọi // Constructor với 2 tham số được gọi Vector u(1.0, 2); Vector x(u); // Constructor sao chép (copy) v=x+u;// tốn tử cộng và gán được gọi } 5/12/2015 59 Thành phần tĩnh (static) Một lớp cĩ thể chứa các thành phần tĩnh, hoặc dữ liệu hoặc hàm Thành phần dữ liệu tĩnh: chỉ cĩ một giá trị duy nhất cho mọi đối tượng của lớp đĩ và tồn tại ngay cả khi khơng cĩ đối tượng nào của lớp đĩ. Hàm thành phần tĩnh: dùng để truy xuất các biến tĩnh được TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI xác định là private Hàm thành phần tĩnh khơng gắn với một đối tượng nào cụ thể của lớp, cĩ thể gọi trực tiếp bằng tên lớp với tốn tử :: 5/12/2015 60 Thành phần tĩnh (static) #include using namespace std; class CDummy { private: static int m; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI public: static int n; CDummy () { n++; m++ }; ~CDummy () { n--; m--}; static int getnumcount(){return m;} }; 5/12/2015 61 Thành phần tĩnh (static) int CDummy::n=0; int CDummy::m=0; int main () { CDummy a; CDummy b[5]; TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI CDummy * c = new CDummy; cout << a.n << endl; //Gọi a.m là sai, gọi Cdummy::getnumcount(); delete c; cout << CDummy::n << endl; return 0;} 5/12/2015 62 Hàm bạn hữu (friend) Ngồi quy tắc trao quyền truy cập thơng qua các từ khố truy cập, C++ cịn cho phép trao quyền truy cập các thành phần của một lớp cho một số hàm hay lớp khác, tạo thuận lợi cho việc triển khai và sử dụng chúng. Các hàm bạn là các hàm khơng phải là thành phần của lớp, được khai báo với từ khố friend và cĩ quyền truy cập đến cả TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI các thành phần private và protected của lớp. Một lớp bạn B của lớp A là lớp cĩ tên được liệt kê trong phần khai báo của lớp A với từ khố friend và các hàm thành phần của B cĩ quyền truy cập đến các thành phần private và protected của lớp A. 5/12/2015 63 Hàm bạn hữu (friend) class Matrix{ public: Matrix AddTo(Matrix const & m); friend Matrix Add(Matrix const & m1, Matrix const & m2); friend Matrix operator + (Matrix const & m1, Matrix TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI const & m2); }; Matrix m1, m2, m3, m4; m3 = m1.AddTo(m2); // gọi hàm thành phần Addto() m4 = Add(m1, m2); // Gọi hàm bạn hữu Add() m4 = m1 + m2; // Gọi hàm bạn hữu là tốn tử cộng

Các file đính kèm theo tài liệu này:

  • pdfngon_ngu_lap_trinh_c_va_c_bai_6_cau_truc_va_lop_8877_1993522.pdf