1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Chương 3 Khái niệm về lớp docx

30 501 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 30
Dung lượng 223,5 KB

Nội dung

Chương Khái niệm lớp Như nói trên, lớp khái niệm trung tâm lập trình hướng đối tượng, mở rộng khái niệm cấu trúc (struct) C ghi (record) PASCAL Ngoài thành phần liệu (như cấu trúc), lớp chứa thành phần hàm , gọi phương thức (method) hay hàm thành viên (member function) Cũng giống cấu trúc, lớp xem kiểu liệu Vì lớp cịn gọi kiểu đối tượng lớp dùng để khai báo biến, mảng đối tượng (như thể dùng kiểu int để khai báo biến mảng nguyên) Như từ lớp tạo (bằng cách khai báo) nhiều đối tượng (biến, mảng) khác Mỗi đối tượng có vùng nhớ riêng Vì quan niệm lớp tập hợp đối tượng kiểu Chương trình bầy cách định nghĩa lớp, cách xây dựng phương thức, giải thích phạm vi truy nhập, sư dụng thành phần lớp, cách khai báo biến, mảng cấu trúc, lời gọi tới phương thức § Định nghĩa lớp Lớp định nghĩa theo mẫu: class tên_lớp { // Khai báo thành phần liệu (thuộc tính) // Khai báo phương thức }; // Định nghĩa (xây dựng) phương thức Chú ý: Thuộc tính lớp biến, mảng, trỏ có kiểu chuẩn (int, float, char, char*, long, ) kiểu chuẩn định nghĩa 93 trước (cấu trúc, hợp, lớp, ) Thuộc tính lớp khơng thể có kiểu lớp đó, kiểu trỏ lớp này, ví dụ: class A { A x ; // Khơng cho phép, x có kiểu lớp A A *p ; // Cho phép , p trỏ kiểu lớp A } ; Khi báo thành phần lớp (thuộc tính phương thức) dùng từ khố private public để quy định phạm vi sử dụng thành phần Nếu không quy định cụ thể (không dùng từ khố private public) C++ hiểu private Các thành phần private (riêng) sử dụng bên lớp (trong thân phương thức lớp) Các hàm phương thức lớp không phép sử dụng thành phần Các thành phần public (công cộng) phép sử dụng bên bên lớp Các thành phần liệu thường (nhưng không bắt buộc) khai báo private để bảo đảm tính giấu kín, bảo vệ an tồn liệu lớp, khơng cho phép hàm bên xâm nhập vào liệu lớp Các phương thức thường khai báo public để chúng gọi tới (sử dụng) từ hàm khác chương trình Các phương thức xây dựng bên ngồi bên định nghĩa lớp Thông thường, phương thức ngắn viết bên định nghĩa lớp, phương thức dài viết bên ngồi định nghĩa lớp Trong thân phương thức lớp (giả sử lớp A) sử dụng: + Các thuộc tính lớp A + Các phương thức lớp A + Các hàm tự lập chương trình Vì phạm vi sử dụng hàm tồn chương trình 94 Giá trị trả phương thức có kiểu (chuẩn ngồi chuẩn) Ví dụ sau minh hoạ điều nói Chúng ta định nghĩa lớp để mô tả xử lý điểm hình đồ hoạ Lớp đăt tên DIEM + Các thuộc tính lớp gồm: int x ; // hoành độ (cột) int y ; // tung độ (hàng) int m ; // mầu + Các phương thức: Nhập liệu điểm Hiển thị điểm ẩn điểm Lớp điểm xây dựng sau: class DIEM { private: int x, y, m ; public: void nhapsl() ; void hien() ; void an() { putpixel(x, y, getbkcolor()); } }; void DIEM::nhap() { cout > x >> y ; cout > m ; } void DIEM::hien() { int mau_ht ; mau_ht = getcolor(); putpixel(x, y, m); setcolor(mau_ht); } Qua ví dụ rút số điều cần nhớ sau: + Trong phương thức (dù viết hay viết định nghĩa lớp) phép truy nhập đến thuộc tính x, y m lớp + Các phương thức viết bên định nghĩa lớp (như phương thức an() ) viết hàm thông thường + Khi xây dựng phương thức bên lớp, cần dùng thêm tên lớp toán tử phạm vi :: đặt trước tên phương phức để quy định rõ phương thức lớp § Biến, mảng đối tượng Như nói trên, lớp (sau định nghĩa) xem kiểu đối tượng dùng để khai báo biến, mảng đối tượng Cách khai báo biến, mảng đối tượng giống khai báo biến, mảng kiểu khác (như int, float, cấu trúc, hợp, ), theo mẫu sau: Tên_lớp danh sách đối ; Tên_lớp danh sách mảng ; 96 Ví dụ sử dụng lớp DIEM §1, khai báo biến, mảng DIEM sau: DIEM d1, d2, d3 ; // Khai báo biến đối tượng d1, d2, d3 DIEM d[20] ; // Khai báo mảng đối tượng d gồm 20 phần tử Mỗi đối tượng sau khai báo cấp phát vùng nhớ riêng để chứa thuộc tính chúng Chú ý khơng có vùng nhớ riêng để chứa phương thức cho đối tượng Các phương thức sử dụng chung cho tất đối tượng lớp Như nhớ cấp phát đối tượng giống cấu trúc Trong trương hợp này: sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = sizeof(d) = 20*6 = 120 Thuộc tính đối tượng: Trong ví dụ trên, đối tượng d1, d2, d3 phần tử d[i] có thuộc tính x, y, m Chú ý thuộc thuộc đối tượng, viết tên thuộc cách riêng rẽ mà phải có tên đối tượng kèm, giống cách viết cấu trúc C hay ghi PASCAL Nói cách khác, cách viết thuộc tính đối tượng sau: tên_đối_tượng.Tên_thuộc_tính Với đối tượng d1, d2, d3 mảng d, viết sau: d1.x // Thuộc tính x đối tượng d1 d2.x // Thuộc tính x đối tượng d2 d3.y // Thuộc tính y đối tượng d3 d[2].m // Thuộc tính m phần tử d[2] d1.x = 100 ; // Gán 100 cho d1.x d2.y = d1.x; // Gán d1.x cho d2.y Sử dụng phương thức Cũng giống hàm, phương thức sử dụng thông qua lời gọi Tuy nhiên lời gọi phương thức phải có tên đối tượng để rõ phương thức thực thuộc tính đối tượng Ví dụ lời gọi: d1.nhapsl(); thực nhập số liệu vào thành phần d1.x, d1.y d1.m 97 Câu lệnh d[3].nhapsl() ; thực nhập số liệu vào thành phần d[3].x, d[3].y d[3].m Chúng ta minh hoạ điều nói chương trình đơn giản sử dụng lớp DIEM để nhập điểm, ẩn điểm vừa nhập Trong chương trình đưa vào hàm kd_do_hoa() dùng để khởi động hệ đồ hoạ #include #include #include class DIEM { private: int x, y, m ; public: void nhapsl(); void an() { putpixel(x,y,getbkcolor()); } void hien(); }; void DIEM::nhapsl() { cout > x >> y ; cout > m ; d2.hien(); d3.hien(); getch(); d1.an(); d2.an(); d3.an(); getch(); closegraph(); } void DIEM::hien() { int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void main() { DIEM d1, d2, d3 ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa(); setbkcolor(BLACK); d1.hien(); 99 } § Con trỏ đối tượng Con trỏ đối tượng dùng để chứa địa biến, mảng đối tượng Nó khai báo sau: Tên_lớp *con trỏ ; Ví dụ dùng lớp DIEM khai báo: DIEM *p1 , *p2, *p3 ; // khai báo trỏ p1, p2, p3 DIEM d1, d2 ; // Khai báo đối tượng d1, d2 DIEM d[20] ; // Khai báo mảng đối tượng thực câu lệnh: p1 = &d2 ; // p1 chứa địa d2 , hay p1 trỏ tới d2 p2 = d ; // p2 trỏ tới đầu mảng d p3 = new DIEM // Tạo đối tượng chứa địa // vào p3 Để sử dụng thuộc tính đối tượng thơng qua trỏ, ta viết sau: Tên_con_trỏ->Tên_thuộc_tính Chú ý: Nếu trỏ chứa địa đầu mảng, dùng trỏ tên mảng 100 Như sau thực câu lệnh thì: p1->x d2.x p2[i].y d[i].y Tóm lại ta có quy tắc sau Quy tắc sử dụng thuộc tính: Để sử dụng thuộc tính đối tượng ta phải dùng phép phép -> Trong chương trình, khơng cho phép viết tên thuộc tính cách đơn độc mà phải kèm tên đối tượng tên trỏ theo mẫu sau: Tên_đối_tượng.Tên_thuộc_tính Tên_con_trỏ->Tên_thuộc_tính Tên_mảng_đối_tượng[chỉ_số].Tên_thuộc_tính Tên_con_trỏ[chỉ_số].Tên_thuộc_tính Chương trình sử dụng lớp DIEM (trong §1) để nhập dẫy điểm, hiển thị ẩn điểm vừa nhập Chương trình dùng trỏ kiểu DIEM dùng toán tử new để tạo dẫy đối tượng #include #include #include class DIEM { private: int x, y, m ; public: void nhapsl(); void an() { putpixel(x,y,getbkcolor()); } void hien(); }; void DIEM::nhapsl() { cout x >> y ; cout > m ; } void DIEM::hien() { int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void main() { DIEM *p; int i, n; cout > n; 102 p = new DIEM[n+1]; for (i=1; i m ; } Rõ ràng phương thức sử dụng tên thuộc tính x, y m cách đơn độc Điều mâu thuẫn với quy tắc sử dụng thuộc tính nêu mục trước Song thể sau: C++ sử dụng trỏ đặc biệt this phương thức Các thuộc tính viết phương thức hiểu thuộc đối tượng trỏ this trỏ tới Như phương thức nhapsl() viết cách tường minh sau: void DIEM::nhapsl() { cout > this->x >> this->y ; cout > this->m ; } 103 Từ góc độ hàm số kết luận rằng: Phương thức có đối trỏ this ln ln đối phương thức 4.2 Tham số ứng với đối trỏ this Xét lời gọi tới phương thức nhapsl() : DIEM d1; d1.nhapsl() ; Trong trường hợp tham số truyền cho trỏ this địa d1: this = &d1 Do đó: this->x d1.x this->y d1.y this->m d1.m Như câu lệnh d1.nhapsl() ; 104 nhập liệu cho thuộc tính đối tượng d1 Từ rút kết luận sau: Tham số truyền cho đối trỏ this địa đối tượng kèm với phương thức lời gọi phương thức 4.3 Các đối khác phương thức Ngoài đối đặc biệt this (đối khơng xuất cách tường minh), phương thức cịn có đối khác khai báo hàm Đối phương thức có kiểu (chuẩn ngồi chuẩn) Ví dụ để xây dựng phương thức vẽ đường thẳng qua điểm ta cần đưa vào đối: Hai đối biến kiểu DIEM, đối thứ ba kiểu nguyên xác định mã mầu Vì có đối ngầm định this đối thứ nhất, nên cần khai báo thêm đối Phương thức viết sau: void DIEM::doan_thang(DIEM d2, int mau) { int mau_ht; mau_ht = getcolor(); setcolor(mau); line(this->x,this->y,d2.x,d2.y); setcolor(mau_ht); } Chương trình sau minh hoạ phương thức có nhiều đối Ta dùng lớp DIEM có số thay đổi: + Bỏ thuộc tính m (mầu) + Bỏ phương thức hien an +Đưa vào phương thức mới: ve_ doan_thang (Vẽ đoạn thẳng qua điểm) ve_tam_giac (Vẽ tam giác qua điểm) do_dai (Tính độ dài đoạn thẳng qua điểm) chu_vi (Tính chu vi tam giác qua điểm) Chương trình cịn minh hoạ: + Việc phương thức sử dụng phương thức khác (phương thức ve_tam_giac sử dụng phương thức ve_doan_thang, phương thức chu_vi sử dụng phương thức do_dai) + Sử dụng trỏ this thân phương thức ve_tam_giac chu_vi Nội dung chương trình nhập điểm, vẽ tam giác có đỉnh điểm vừa nhập sau tính chu vi tam giác #include #include #include 105 #include #include class DIEM { private: int x, y ; public: void nhapsl(); void ve_doan_thang(DIEM d2, int mau) ; void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; double do_dai(DIEM d2) { DIEM d1 = *this ; return sqrt( pow(d1.x - d2.x,2) + pow(d1.y - d2.y,2) ) ; } double chu_vi(DIEM d2, DIEM d3); }; 106 void DIEM::nhapsl() { cout x >> y ; } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ""); } void DIEM::ve_doan_thang(DIEM d2, int mau) { setcolor(mau); line(this->x,this->y,d2.x,d2.y); } void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(*this,mau); } double DIEM::chu_vi(DIEM d2, DIEM d3) { double s; s= (*this).do_dai(d2) + d2.do_dai(d3) + d3.do_dai(*this) ; return s; } void main() { DIEM d1, d2, d3; char tb_cv[20] ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa(); d1.ve_tam_giac(d2,d3,15); double s = d1.chu_vi(d2,d3); sprintf(tb_cv,"Chu vi = %0.2f", s); outtextxy(10,10,tb_cv); getch(); closegraph(); } Một số nhận xét đối phương thức lời gọi phương 107 thức + Quan sát nguyên mẫu phương thức: void ve_doan_thang(DIEM d2, int mau) ; thấy phương thức có đối: Đối thứ nhât đối tượng DIEM this trỏ tới Đối thứ hai đối tượng DIEM d2 Đối thứ ba biến nguyên mau Nội dung phương thức vẽ đoạn thẳng qua điểm *this d2 theo mã mầu mau Xem thân phương thấy nội dung này: void DIEM::ve_doan_thang(DIEM d2, int mau) { setcolor(mau); line(this->x,this->y,d2.x,d2.y); 108 } d3.ve_doan_thang(*this,mau); Tuy nhiên trương hợp này, vai trị this khơng cao lắm, đưa vào cốt làm rõ đối thứ Trong thân phương thức bỏ từ khố this + Vai trò this trở nên quan trọng phương thức ve_tam_giac: } Phương án không dùng this phương thức ve_tam_giac: void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) { DIEM d1; void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; d1.x = x; Phương thức có đối là: d1.y = y; this trỏ tới đối tượng kiểu DIEM d1.ve_doan_thang(d2,mau); d2 đối tượng kiểu DIEM d2.ve_doan_thang(d3,mau); d3 đối tượng kiểu DIEM mau biến nguyên Nội dung phương thức vẽ cạnh: cạnh qua *this d2 cạnh qua d2 d3 cạnh qua d3 *this Các cạnh vẽ nhờ sử dụng phương thức ve_doan_thang: Vẽ cạnh dùng lệnh: (*this).ve_doan_thang(d2,mau) ; Vẽ cạnh dùng lệnh: d2.ve_doan_thang(d3,mau); Vẽ cạnh dùng lệnh: d3.ve_doan_thang(*this,mau); Trong trường rõ ràng vai trò this quan trọng Nếu khơng dùng cơng việc trơ nên khó khăn, dài dịng khó hiểu Chúng ta so sánh phương án: Phương án dùng this phương thức ve_tam_giac: void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(d1,mau); } § Nói thêm kiểu phương thức kiểu đối phương thức 5.1 Kiểu phương thức 109 Phương thức khơng có giá trị trả (kiểu void) trả giá trị có kiểu bất kỳ, kể giá trị kiểu đối tượng, trỏ đối tượng, tham chiếu đối tượng 5.2 Đối phương thức Đối phương thức (cũng giống đối hàm) có kiểu bất kỳ: + Kiểu liệu chuẩn int, float, char, Con trỏ tham chiếu đến kiểu liệu chuẩn int*, float*, char*, int&, float&, char&, + Các kiểu chuẩn định nghĩa trước đối tượng, cấu trúc, hợp, enum, Con trỏ tham chiếu đến kiểu chuẩn 110 + Kiểu đối tượng phương thức, trỏ tham chiếu đến kiểu đối tượng 5.3 Các ví dụ Ví dụ minh hoạ: + Thuộc tính (thành phần liệu) lớp đối tượng lớp khác định nghĩa bên + Phương thức có giá trị trả kiểu đối tượng trỏ đối tượng Nội dung chương trình nhập dẫy hình chữ nhật, sau tìm hình chữ nhật có max diện tích hình chữ nhật có max chu vi Chương trình tổ chức thành lớp: + Lớp HINH_CN gồm: - Các thuộc tính: d r (chiều dài chiều rộng) - Các phương thức void nhapsl() ; // Nhập chiều dài, rộng int dien_tich(); // Tính diện tích int chu_vi() ; // Tính chu vi + Lớp DAY_HINH_CN gồm - Các thuộc tính: int n ; //số hình chữ nhật dẫy HINH_CN *h; //Con trỏ tới dẫy đối tượng lớp HINH_CN - Các phương thức void nhapsl(); // Nhập dẫy hình chữ nhật HINH_CN hinh_dt_max() ; //Trả hình chữ nhật có // diện tích max HINH_CN *hinh_cv_max() ; // Trả trỏ tới HCN có // chu vi max #include #include class HINH_CN { private: int d, r; // chieu dai va chieu rong public: void nhapsl() { cout > d >> r ; } void in() { cout

Ngày đăng: 23/12/2013, 05:17

TỪ KHÓA LIÊN QUAN

w