text:
Chương 3 Khái niệm về lớp
Chia sẻ: Men Men | Ngày: | Loại File: DOC | Số trang:30
lượt xem 26
download
Chương 3 Khái niệm về lớp
Tham khảo tài liệu 'chương 3 khái niệm về lớp', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Chương 3 Khái niệm về lớp
- Chương 3 định nghĩa trước (cấu trúc, hợp, lớp, ...) . Thuộc tính của lớp không Khái niệm về lớp thể có kiểu của chính lớp đó, nhưng có thể là kiểu con trỏ lớp này, ví dụ: Như đã nói ở trên, lớp là khái niệm trung tâm của lập trình class A hướng đối tượng, nó là sự mở rộng của các khái niệm cấu trúc { (struct) của C và bản ghi (record) của PASCAL. Ngoài các thành phần dữ liệu (như cấu trúc), lớp còn chứa các thành phần hàm , A x ; // Không cho phép, vì x có kiểu lớp A còn gọi là phương thức (method) hay hàm thành viên (member A *p ; // Cho phép , vì p là con trỏ kiểu lớp A function). Cũng giống như cấu trúc, lớp có thể xem như một kiểu ... dữ liệu. Vì vậy lớp còn gọi là kiểu đối tượng và lớp được dùng } ; để khai báo các biến, mảng đối tượng (như thể dùng kiểu int để 2. Khi báo các thành phần của lớp (thuộc tính và phương thức) khai báo các biến mảng nguyên). Như vậy từ một lớp có thể tạo ra có thể dùng các từ khoá private và public để quy định phạm vi sử (bằng cách khai báo) nhiều đối tượng (biến, mảng) khác nhau. dụng của các thành phần. Nếu không quy định cụ thể (không dùng Mỗi đối tượng có vùng nhớ riêng của mình. Vì vậy cũng có thể các từ khoá private và public) thì C++ hiểu đó là private. quan niệm lớp là tập hợp các đối tượng cùng kiểu. Các thành phần private (riêng) chỉ được sử dụng bên trong lớp Chương này sẽ trình bầy cách định nghĩa lớp, cách xây dựng (trong thân của các phương thức của lớp). Các hàm không phải là phương thức, giải thích về phạm vi truy nhập, sư dụng các thành phương thức của lớp không được phép sử dụng các thành phần phần của lớp, cách khai báo biến, mảng cấu trúc, lời gọi tới các này. phương thức. Các thành phần public (công cộng) được phép sử dụng ở cả bên trong và bên ngoài lớp. § 1. Định nghĩa lớp 3. Các thành phần dữ liệu thường (nhưng không bắt buộc) khai 1. Lớp được định nghĩa theo mẫu: báo là private để bảo đảm tính giấu kín, bảo vệ an toàn dữ liệu của lớp, không cho phép các hàm bên ngoài xâm nhập vào dữ liệu class tên_lớp của lớp. { 4. Các phương thức thường khai báo là public để chúng có thể // Khai báo các thành phần dữ liệu (thuộc tính) được gọi tới (sử dụng) từ các hàm khác trong chương trình. // Khai báo các phương thức 5. Các phương thức có thể được xây dựng bên ngoài hoặc bên }; trong định nghĩa lớp. Thông thường, các phương thức ngắn được viết bên trong định nghĩa lớp, còn các phương thức dài thì viết bên // Định nghĩa (xây dựng) các phương thức ngoài định nghĩa lớp. Chú ý: 6. Trong thân phương thức của một lớp (giả sử lớp A) có thể Thuộc tính của lớp có thể là các biến, mảng, con trỏ có kiểu sử dụng: chuẩn (int, float, char, char*, long,...) hoặc kiểu ngoài chuẩn đã + Các thuộc tính của lớp A 93 94
- + Các phương thức của lớp A void DIEM::nhap() + Các hàm tự lập trong chương trình. Vì phạm vi sử dụng của { hàm là toàn chương trình. cout > x >> y ; 95 96 Ví dụ sau sẽ minh hoạ các điều nói trên. Chúng ta sẽ định nghĩa cout > m ; + Các thuộc tính của lớp gồm: } int x ; // hoành độ (cột) void DIEM::hien() int y ; // tung độ (hàng) { int m ; // mầu int mau_ht ; + Các phương thức: mau_ht = getcolor(); Nhập dữ liệu một điểm putpixel(x, y, m); Hiển thị một điểm setcolor(mau_ht); ẩn một điểm } Lớp điểm được xây dựng như sau: Qua ví dụ trên có thể rút ra một số điều cần nhớ sau: class DIEM + Trong cả 3 phương thức (dù viết trong hay viết ngoài định { nghĩa lớp) đều được phép truy nhập đến các thuộc tính x, y và m private: của lớp. int x, y, m ; + Các phương thức viết bên trong định nghĩa lớp (như phương thức an() ) được viết như một hàm thông thường. public: + Khi xây dựng các phương thức bên ngoài lớp, cần dùng thêm void nhapsl() ; tên lớp và toán tử phạm vi :: đặt ngay trước tên phương phức để void hien() ; quy định rõ đây là phương thức của lớp nào. void an() { § 2. Biến, mảng đối tượng putpixel(x, y, getbkcolor()); Như đã nói ở trên, một lớp (sau khi định nghĩa) có thể xem như } một kiểu đối tượng và có thể dùng để khai báo các biến, mảng }; đối tượng. Cách khai báo biến, mảng đối tượng cũng giống như
- khai báo biến, mảng các kiểu khác (như int, float, cấu trúc, d1.x = 100 ; // Gán 100 cho d1.x hợp, ...), theo mẫu sau: d2.y = d1.x; // Gán d1.x cho d2.y Tên_lớp danh sách đối ; Tên_lớp danh sách mảng ; Sử dụng các phương thức Cũng giống như hàm, một phương thức được sử dụng thông Ví dụ sử dụng lớp DIEM ở §1, có thể khai báo các biến, mảng qua lời gọi. Tuy nhiên trong lời gọi phương thức bao giờ cũng DIEM như sau: phải có tên đối tượng để chỉ rõ phương thức thực hiện trên các DIEM d1, d2, d3 ; // Khai báo 3 biến đối tượng d1, d2, d3 thuộc tính của đối tượng nào. Ví dụ lời gọi: DIEM d[20] ; // Khai báo mảng đối tượng d gồm 20 phần d1.nhapsl(); tử sẽ thực hiện nhập số liệu vào các thành phần d1.x, d1.y và d1.m Mỗi đối tượng sau khi khai báo sẽ được cấp phát một vùng nhớ Câu lệnh 97 98 riêng để chứa các thuộc tính của chúng. Chú ý rằng sẽ không có vùng nhớ riêng để chứa các phương thức cho mỗi đối tượng. Các d[3].nhapsl() ; phương thức sẽ được sử dụng chung cho tất cả các đối tượng sẽ thực hiện nhập số liệu vào các thành phần d[3].x, d[3].y và cùng lớp. Như vậy về bộ nhớ được cấp phát thì đối tượng giống d[3].m cấu trúc. Trong trương hợp này: Chúng ta sẽ minh hoạ các điều nói trên bằng một chương trình sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6 đơn giản sử dụng lớp DIEM để nhập 3 điểm, hiện rồi ẩn các sizeof(d) = 20*6 = 120 đ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ạ. Thuộc tính của đối tượng: #include Trong ví dụ trên, mỗi đối tượng d1, d2, d3 và mỗi phần tử d[i] đều có 3 thuộc tính là x, y, m. Chú ý là mỗi thuộc đều thuộc về #include một đối tượng, vì vậy không thể viết tên thuộc một cách riêng rẽ #include mà bao giờ cũng phải có tên đối tượng đi kèm, giống như cách viết class DIEM trong cấu trúc của C hay bản ghi của PASCAL. Nói cách khác, { cách viết thuộc tính của đối tượng như sau: private: tên_đối_tượng.Tên_thuộc_tính int x, y, m ; Với các đối tượng d1, d2, d3 và mảng d, có thể viết như sau: public: d1.x // Thuộc tính x của đối tượng d1 void nhapsl(); d2.x // Thuộc tính x của đối tượng d2 void an() d3.y // Thuộc tính y của đối tượng d3 { d[2].m // Thuộc tính m của phần tử d[2] putpixel(x,y,getbkcolor());
- } d1.nhapsl(); void hien(); d2.nhapsl(); }; d3.nhapsl(); void DIEM::nhapsl() kd_do_hoa(); { cout > x >> y ; d2.hien(); cout > m ; } getch(); d1.an(); void DIEM::hien() d2.an(); { d3.an(); 99 100 int mau_ht; getch(); mau_ht = getcolor() ; closegraph(); putpixel(x,y,m); } setcolor(mau_ht); } § 3. Con trỏ đối tượng void kd_do_hoa() Con trỏ đối tượng dùng để chứa địa chỉ của biến, mảng đối { tượng. Nó được khai báo như sau: int mh, mode ; Tên_lớp *con trỏ ; mh=mode=0; Ví dụ dùng lớp DIEM có thể khai báo: initgraph(&mh, &mode, ""); DIEM *p1 , *p2, *p3 ; // khai báo 3 con trỏ p1, p2, p3 } DIEM d1, d2 ; // Khai báo 2 đối tượng d1, d2 void main() DIEM d[20] ; // Khai báo mảng đối tượng { và có thể thực hiện các câu lệnh: DIEM d1, d2, d3 ; p1 = &d2 ; // p1 chứa địa chỉ của d2 , hay p1 trỏ tới d2 p2 = d ; // p2 trỏ tới đầu mảng d
- p3 = new DIEM // Tạo một đối tượng và chứa địa chỉ của nó int x, y, m ; // vào p3 public: Để sử dụng thuộc tính của đối tượng thông qua con trỏ, ta viết void nhapsl(); như sau: void an() Tên_con_trỏ->Tên_thuộc_tính { Chú ý: Nếu con trỏ chứa địa chỉ đầu của mảng, có thể dùng putpixel(x,y,getbkcolor()); con trỏ như tên mảng. } Như vậy sau khi thực hiện các câu lệnh trên thì: void hien(); p1->x và d2.x là như nhau }; p2[i].y và d[i].y là như nhau void DIEM::nhapsl() { Tóm lại ta có quy tắc sau cout x >> y ; đối tượng ta phải dùng phép . hoặc phép -> . Trong chương trình, không cho phép viết tên thuộc tính một cách đơn độc mà phải đi cout > m ; 101 102 Tên_đối_tượng.Tên_thuộc_tính } Tên_con_trỏ->Tên_thuộc_tính void DIEM::hien() 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 int mau_ht; Chương trình dưới đây cũng sử dụng lớp DIEM (trong §1) để mau_ht = getcolor() ; nhập một dẫy điểm, hiển thị và ẩn các điểm vừa nhập. Chương putpixel(x,y,m); trình dùng một con trỏ kiểu DIEM và dùng toán tử new để tạo ra một dẫy đối tượng. setcolor(mau_ht); #include } #include void kd_do_hoa() #include { class DIEM int mh, mode ; { mh=mode=0; private: initgraph(&mh, &mode, "");
- } cout > m ; { } DIEM *p; Rõ ràng trong phương thức này chúng ta sử dụng tên các thuộc int i, n; tính x, y và m một cách đơn độc. Điều này có vẻ như mâu thuẫn cout > n; như sau: p = new DIEM[n+1]; C++ sử dụng con trỏ đặc biệt this trong các phương thức. Các thuộc tính viết trong phương thức được hiểu là thuộc một đối for (i=1; ix >> this->y ; for (i=1; i this->m ; getch(); } 103 104 closegraph(); Từ góc độ hàm số có thể kết luận rằng: Phương thức bao giờ } cũng có ít nhất một đối là con trỏ this và nó luôn luôn là đối đầu tiên của phương thức. § 4. Đối của phương thức, con trỏ this 4.2. Tham số ứng với đối con trỏ this 4.1. Con trỏ this là đối thứ nhất của phương thức Xét một lời gọi tới phương thức nhapsl() : Chúng ta hãy xem lại phương thức nhapsl của lớp DIEM DIEM d1; void DIEM::nhapsl() d1.nhapsl() ; { Trong trường hợp này tham số truyền cho con trỏ this chính là địa chỉ của d1: cout x >> y ; Do đó:
- this->x chính là d1.x + Bỏ thuộc tính m (mầu) this->y chính là d1.y + Bỏ các phương thức hien và an this->m chính là d1.m +Đưa vào 4 phương thức mới: Như vậy câu lệnh ve_ doan_thang (Vẽ đoạn thẳng qua 2 điểm) d1.nhapsl() ; ve_tam_giac (Vẽ tam giác qua 3 điểm) sẽ nhập dữ liệu cho các thuộc tính của đối tượng d1. Từ đó có thể do_dai (Tính độ dài của đoạn thẳng qua 2 điểm) rút ra kết luận sau: chu_vi (Tính chu vi tam giác qua 3 điểm) Tham số truyền cho đối con trỏ this chính là địa chỉ của đối Chương trình còn minh hoạ: tượng đi kèm với phương thức trong lời gọi phương thức. + Việc phương thức này sử dụng phương thức khác (phương 4.3. Các đối khác của phương thức 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) Ngoài đối đặc biệt this (đối này không xuất hiện một cách tường minh), phương thức còn có các đối khác được khai báo như + Sử dụng con trỏ this trong thân các phương thức ve_tam_giac trong các hàm. Đối của phương thức có thể có kiểu bất kỳ (chuẩn và chu_vi và ngoài chuẩn). Nội dung chương trình là nhập 3 điểm, vẽ tam giác có đỉnh là 3 Ví dụ để xây dựng phương thức vẽ đường thẳng qua 2 điểm ta điểm vừa nhập sau đó tính chu vi tam giác. cần đưa vào 3 đối: Hai đối là 2 biến kiểu DIEM, đối thứ ba kiểu #include nguyên xác định mã mầu. Vì đã có đối ngầm định this là đối thứ #include nhất, nên chỉ cần khai báo thêm 2 đối. Phương thức có thể viết #include như sau: #include 105 106 void DIEM::doan_thang(DIEM d2, int mau) #include { class DIEM int mau_ht; { mau_ht = getcolor(); private: setcolor(mau); int x, y ; public: line(this->x,this->y,d2.x,d2.y); void nhapsl(); setcolor(mau_ht); void ve_doan_thang(DIEM d2, int mau) ; } void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; Chương trình sau minh hoạ các phương thức có nhiều đối. Ta double do_dai(DIEM d2) vẫn dùng lớp DIEM nhưng có một số thay đổi: {
- DIEM d1 = *this ; { return sqrt( pow(d1.x - d2.x,2) + double s; pow(d1.y - d2.y,2) ) ; s= (*this).do_dai(d2) + d2.do_dai(d3) + d3.do_dai(*this) ; } return s; double chu_vi(DIEM d2, DIEM d3); }; } void DIEM::nhapsl() void main() { { cout x >> y ; char tb_cv[20] ; } d1.nhapsl(); void kd_do_hoa() d2.nhapsl(); { d3.nhapsl(); int mh, mode ; kd_do_hoa(); mh=mode=0; d1.ve_tam_giac(d2,d3,15); initgraph(&mh, &mode, ""); double s = d1.chu_vi(d2,d3); } sprintf(tb_cv,"Chu vi = %0.2f", s); void DIEM::ve_doan_thang(DIEM d2, int mau) outtextxy(10,10,tb_cv); { getch(); closegraph(); setcolor(mau); } line(this->x,this->y,d2.x,d2.y); } Một số nhận xét về đối của phương thức và lời gọi 107 108 phương thức void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) + Quan sát nguyên mẫu phương thức: { void ve_doan_thang(DIEM d2, int mau) ; (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); sẽ thấy phương thức có 3 đối: d3.ve_doan_thang(*this,mau); Đối thứ nhât là một đối tượng DIEM do this trỏ tới } Đối thứ hai là đối tượng DIEM d2 Đối thứ ba là biến nguyên mau double DIEM::chu_vi(DIEM d2, DIEM d3)
- Nội dung phương thức là vẽ một đoạn thẳng đi qua các điểm Trong trường này rõ ràng vai trò của this rất quan trọng. Nếu *this và d2 theo mã mầu mau. Xem thân của phương sẽ thấy được không dùng nó thì công việc trơ nên khó khăn, dài dòng và khó nội dung này: hiểu hơn. Chúng ta hãy so sánh 2 phương án: void DIEM::ve_doan_thang(DIEM d2, int mau) Phương án dùng this trong phương thức ve_tam_giac: { void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) setcolor(mau); { line(this->x,this->y,d2.x,d2.y); (*this).ve_doan_thang(d2,mau); } d2.ve_doan_thang(d3,mau); Tuy nhiên trong trương hợp này, vai trò của this không cao lắm, d3.ve_doan_thang(*this,mau); vì nó được đưa vào chỉ cốt làm rõ đối thứ nhất. Trong thân phương } thức có thể bỏ từ khoá this vẫn được. Phương án không dùng this trong phương thức ve_tam_giac: + Vai trò của this trở nên quan trọng trong phương thức void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) ve_tam_giac: { void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; DIEM d1; Phương thức này có 4 đối là: d1.x = x; this trỏ tới một đối tượng kiểu DIEM d1.y = y; d2 một đối tượng kiểu DIEM d1.ve_doan_thang(d2,mau); d3 một đối tượng kiểu DIEM d2.ve_doan_thang(d3,mau); mau một biến nguyên d3.ve_doan_thang(d1,mau); Nội dung phương thức là vẽ 3 cạnh: } cạnh 1 đi qua *this và d2 cạnh 2 đi qua d2 và d3 § 5. Nói thêm về kiểu phương thức và kiểu đối của phương cạnh 3 đi qua d3 và *this Các cạnh trên được vẽ nhờ sử dụng phương thức thức ve_doan_thang: 5.1. Kiểu phương thức 109 110 Vẽ cạnh 1 dùng lệnh: (*this).ve_doan_thang(d2,mau) ; Phương thức có thể không có giá trị trả về (kiểu void) hoặc có Vẽ cạnh 2 dùng lệnh: d2.ve_doan_thang(d3,mau); thể trả về một giá trị có kiểu bất kỳ, kể cả giá trị kiểu đối tượng, con trỏ đối tượng, tham chiếu đối tượng. Vẽ cạnh 3 dùng lệnh: d3.ve_doan_thang(*this,mau);
- 5.2. Đối của phương thức HINH_CN *h; //Con trỏ tới dẫy đối tượng của lớp Đối của phương thức (cũng giống như đối của hàm) có thể có HINH_CN kiểu bất kỳ: - Các phương thức + Kiểu dữ liệu chuẩn như int, float, char,... . Con trỏ hoặc tham void nhapsl(); // Nhập một dẫy hình chữ nhật chiếu đến kiểu dữ liệu chuẩn như int*, float*, char*, int&, float&, HINH_CN hinh_dt_max() ; //Trả về hình chữ nhật có char&,... // diện tích max + Các kiểu ngoài chuẩn đã định nghĩa trước như đối tượng, cấu trúc, hợp, enum,... . Con trỏ hoặc tham chiếu đến các kiểu HINH_CN *hinh_cv_max() ; // Trả về con trỏ tới HCN có ngoài chuẩn này. // chu vi max + Kiểu đối tượng của chính phương thức, con trỏ hoặc tham #include chiếu đến kiểu đối tượng này. #include 5.3. Các ví dụ class HINH_CN Ví dụ 1 minh hoạ: { + Thuộc tính (thành phần dữ liệu) của lớp có thể là đối tượng private: của lớp khác đã định nghĩa bên trên. int d, r; // chieu dai va chieu rong + Phương thức có giá trị trả về kiểu đối tượng và con trỏ đối public: tượng. void nhapsl() Nội dung chương trình là nhập một dẫy hình chữ nhật, sau đó { tìm hình chữ nhật có max diện tích và hình chữ nhật có max chu vi. cout > d >> r ; + Lớp HINH_CN gồm: } - Các thuộc tính: d và r (chiều dài và chiều rộng) void in() - Các phương thức { void nhapsl() ; // Nhập chiều dài, rộng cout
- } if (h[i].dien_tich() > hdtmax.dien_tich() ) int chu_vi() hdtmax = h[i]; { return hdtmax; return 2*(d+r); } } HINH_CN *DAY_HINH_CN::hinh_cv_max() }; { class DAY_HINH_CN int imax = 1; { for (int i=2; i h[imax].chu_vi() ) int n; // So hinh ch nhat imax = i ; HINH_CN *h; return (h+imax); public: } void nhapsl(); HINH_CN hinh_dt_max() ; void main() HINH_CN *hinh_cv_max() ; { }; DAY_HINH_CN d; void DAY_HINH_CN::nhapsl() HINH_CN hdtmax; { d.nhapsl(); cout > n; hdtmax.in() ; h = new HINH_CN[n+1]; HINH_CN *hcvmax=d.hinh_cv_max(); for (int i=1;iin() ; h[i].nhapsl(); getch(); } } HINH_CN DAY_HINH_CN::hinh_dt_max() { Ví dụ 2 minh hoạ: HINH_CN hdtmax; + Thuộc tính (thành phần dữ liệu) của lớp có thể là đối tượng hdtmax = h[1]; của lớp khác đã định nghĩa bên trên. for (int i=2; i
- + Vai trò của con trỏ this (xem phương thức maxdt của lớp + Thuật toán là: TAM_GIAC) - Duyệt qua các tổ hợp 3 điểm. + Phương thức tĩnh (xem phương thức tao_tg của lớp - Dùng phương thức tao_tg để lập tam giác từ 3 điểm TAM_GIAC) - Dùng phương thức maxdt để chọn tam giác có diện tích Nội dung chương trình là nhập một dẫy các điểm, sau đó tìm lớn hơn trong 2 tam giác: tam giác vừa tạo và tam giác có diện tích tam giác lớn nhất (về diện tích) có đỉnh là các điểm vừa nhập. max (trong số các tam giác đã tạo) Chương trình được tổ chức thành 2 lớp: #include + Lớp DIEM gồm: #include - Các thuộc tính: x và y (toạ độ của điểm) #include - Các phương thức class DIEM void nhapsl() ; // Nhập x, y { void in() ; // In toạ độ private: double do_dai(DIEM d2) ; // Tính độ dài đoạn thẳng qua double x,y; // Toa do cua diem // 2 điểm (điểm ẩn xác định bởi this và điểm d2) public: + Lớp TAM_GIAC gồm: - Các thuộc tính: void nhapsl() DIEM d1,d2,d3; // 3 đỉnh của tam giác { - Các phương thức: cout > x >> y ; void in(); // In toạ độ 3 đỉnh } // Tạo một đối tượng TAM_GIAC từ 3 đối tượng DIEM void in() static TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { double dien_tich() ; // Tính diện tích cout
- }; { class TAM_GIAC cout
- for (i=1; i
- public: } void nhapsl() double dien_tich() ; { TAM_GIAC maxdt(TAM_GIAC t2); cout > x >> y ; }; } void TAM_GIAC::nhapsl() void in() { 119 120 cout
- } t=tao_tg(d[i],d[j],d[k]); TAM_GIAC TAM_GIAC::maxdt(TAM_GIAC t2) tmax = tmax.maxdt(t); { } if (this->dien_tich() > t2.dien_tich()) cout
- } Dùng lớp DIEM, ta xây dựng hàm tính độ dài của đoạn thẳng đi qua 2 điểm như sau: Nhận xét: Không cho phép dùng từ khoá friend khi xây dựng hàm (bên ngoài lớp) double do_dai(DIEM d1, DIEM d2) { return sqrt(pow(d1.x-d2.x,2) + pow(d1.y-d2.y,2)); § 6. Hàm, hàm bạn } 6.1. Hàm có các tính chất sau: Hàm này sẽ bị báo lỗi khi dịch, vì trong thân hàm không cho + Phạm vi của hàm là toàn bộ chương trình, vì vậy hàm có thể phép sử dụng các thuộc tính d1.x, d1.y, d2.x, d2.y của các đối được gọi tới từ bất kỳ chỗ nào. Như vây trong các phương thức có tượng d1 và d2 thuộc lớp DIEM. thể sử dụng hàm. + Phạm vi sử dụng của các phương thức (public) là toàn + Đối của hàm có thể là các đối tượng, tuy nhiên có một hạn chương trình, vì vậy trong thân hàm có thể gọi tới các phương chế là trong thân hàm không cho phép truy nhập tới thuộc tính của 123 124 c. Ví dụ giả sử đã định nghĩa lớp: thứ các đối này. Ví dụ giả sử đã định nghĩa lớp: class DIEM class DIEM { { private: private: double x,y; // Toa do cua diem double x,y; // Toa do cua diem public: public: void nhapsl() void nhapsl() { { cout x >> y ; cin >> x >> y ; } } void in() void in() { { cout
- return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); cout > x >> y ; }; } Khi đó bằng cách dùng phương thức do_dai, ta có thể viết hàm void in() tính diện tích tam giác có đỉnh là các đối tượng d1, d2, d3 của lớp { DIEM như sau: cout
- for (i=1; i
- { imax = i ; return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); jmax = j; } kmax = k; double dt_tg(int i, int j, int k) } { cout
CÓ THỂ BẠN MUỐN DOWNLOAD
-
CHƯƠNG 3 - CÁC LỆNH VẼ
29 p | 236 | 112
-
Chương 11: INPUT – OUTPUT TRONG JAVA
87 p | 283 | 105
-
BÀI 3. TIMER
6 p | 225 | 79
-
Lập trình java căn bản - Chương 3: Lớp và đối tượng
61 p | 233 | 66
-
Bài giảng lập trình java - Bài 2
11 p | 102 | 39
-
Khái quát về PHP Framework
16 p | 97 | 29
-
LẬP TRÌNH C nâng cao - bài 3 - nhắc lại về lớp
6 p | 89 | 25
-
Chương 9: DÒNG VÀO/RA (I/O Streams)
22 p | 70 | 19
-
LẬP TRÌNH C nâng cao - bài 3 - nhắc lại về lớp part 2
6 p | 72 | 18
-
Bài giảng Trí tuệ nhân tạo - Chương 3: Các kỹ thuật tìm kiếm Heuristics
35 p | 61 | 17
-
Khái niệm về ontology
9 p | 51 | 11
-
Bài giảng Lập trình căn bản: Chương 1 - ThS. Nguyễn Cao Trí
20 p | 54 | 9
-
Bài giảng Lập trình cơ bản bài 4: Phần mềm máy tính và mạng máy tính
41 p | 32 | 6
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 6: Mẫu (template)
27 p | 12 | 3
-
Bài giảng Lập trình hướng đối tượng (Dùng C#): Chương 3 - Trần Minh Thái
70 p | 9 | 2
-
Bài giảng Kỹ thuật lập trình: Chương 3 - Trần Thị Kim Chi (tt)
33 p | 8 | 2
-
Bài giảng Chương 3: Vài kiến thức nâng cao về C, C++
40 p | 8 | 0

markdown:
# Chương 3 Khái niệm về lớp
Chia sẻ: Men Men | Ngày: | Loại File: DOC | Số trang:30
lượt xem 26
download
![](http://image.tlvnimg.com/document/thumbnail/2010/20100526/tmaccounttemp1/80x100/phan_3_6444.jpg)
##
Chương 3 Khái niệm về lớp
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static.tlvnimg.com/b2013az/templates/version1/default/images/down16x21.png)
Tham khảo tài liệu 'chương 3 khái niệm về lớp', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
##
Nội dung Text: Chương 3 Khái niệm về lớp
- Chương 3 định nghĩa trước (cấu trúc, hợp, lớp, ...) . Thuộc tính của lớp không Khái niệm về lớp thể có kiểu của chính lớp đó, nhưng có thể là kiểu con trỏ lớp này, ví dụ: Như đã nói ở trên, lớp là khái niệm trung tâm của lập trình class A hướng đối tượng, nó là sự mở rộng của các khái niệm cấu trúc { (struct) của C và bản ghi (record) của PASCAL. Ngoài các thành phần dữ liệu (như cấu trúc), lớp còn chứa các thành phần hàm , A x ; // Không cho phép, vì x có kiểu lớp A còn gọi là phương thức (method) hay hàm thành viên (member A *p ; // Cho phép , vì p là con trỏ kiểu lớp A function). Cũng giống như cấu trúc, lớp có thể xem như một kiểu ... dữ liệu. Vì vậy lớp còn gọi là kiểu đối tượng và lớp được dùng } ; để khai báo các biến, mảng đối tượng (như thể dùng kiểu int để 2. Khi báo các thành phần của lớp (thuộc tính và phương thức) khai báo các biến mảng nguyên). Như vậy từ một lớp có thể tạo ra có thể dùng các từ khoá private và public để quy định phạm vi sử (bằng cách khai báo) nhiều đối tượng (biến, mảng) khác nhau. dụng của các thành phần. Nếu không quy định cụ thể (không dùng Mỗi đối tượng có vùng nhớ riêng của mình. Vì vậy cũng có thể các từ khoá private và public) thì C++ hiểu đó là private. quan niệm lớp là tập hợp các đối tượng cùng kiểu. Các thành phần private (riêng) chỉ được sử dụng bên trong lớp Chương này sẽ trình bầy cách định nghĩa lớp, cách xây dựng (trong thân của các phương thức của lớp). Các hàm không phải là phương thức, giải thích về phạm vi truy nhập, sư dụng các thành phương thức của lớp không được phép sử dụng các thành phần phần của lớp, cách khai báo biến, mảng cấu trúc, lời gọi tới các này. phương thức. Các thành phần public (công cộng) được phép sử dụng ở cả bên trong và bên ngoài lớp. § 1. Định nghĩa lớp 3. Các thành phần dữ liệu thường (nhưng không bắt buộc) khai 1. Lớp được định nghĩa theo mẫu: báo là private để bảo đảm tính giấu kín, bảo vệ an toàn dữ liệu của lớp, không cho phép các hàm bên ngoài xâm nhập vào dữ liệu class tên_lớp của lớp. { 4. Các phương thức thường khai báo là public để chúng có thể // Khai báo các thành phần dữ liệu (thuộc tính) được gọi tới (sử dụng) từ các hàm khác trong chương trình. // Khai báo các phương thức 5. Các phương thức có thể được xây dựng bên ngoài hoặc bên }; trong định nghĩa lớp. Thông thường, các phương thức ngắn được viết bên trong định nghĩa lớp, còn các phương thức dài thì viết bên // Định nghĩa (xây dựng) các phương thức ngoài định nghĩa lớp. Chú ý: 6. Trong thân phương thức của một lớp (giả sử lớp A) có thể Thuộc tính của lớp có thể là các biến, mảng, con trỏ có kiểu sử dụng: chuẩn (int, float, char, char*, long,...) hoặc kiểu ngoài chuẩn đã + Các thuộc tính của lớp A 93 94
- + Các phương thức của lớp A void DIEM::nhap() + Các hàm tự lập trong chương trình. Vì phạm vi sử dụng của { hàm là toàn chương trình. cout > x >> y ; 95 96 Ví dụ sau sẽ minh hoạ các điều nói trên. Chúng ta sẽ định nghĩa cout > m ; + Các thuộc tính của lớp gồm: } int x ; // hoành độ (cột) void DIEM::hien() int y ; // tung độ (hàng) { int m ; // mầu int mau_ht ; + Các phương thức: mau_ht = getcolor(); Nhập dữ liệu một điểm putpixel(x, y, m); Hiển thị một điểm setcolor(mau_ht); ẩn một điểm } Lớp điểm được xây dựng như sau: Qua ví dụ trên có thể rút ra một số điều cần nhớ sau: class DIEM + Trong cả 3 phương thức (dù viết trong hay viết ngoài định { nghĩa lớp) đều được phép truy nhập đến các thuộc tính x, y và m private: của lớp. int x, y, m ; + Các phương thức viết bên trong định nghĩa lớp (như phương thức an() ) được viết như một hàm thông thường. public: + Khi xây dựng các phương thức bên ngoài lớp, cần dùng thêm void nhapsl() ; tên lớp và toán tử phạm vi :: đặt ngay trước tên phương phức để void hien() ; quy định rõ đây là phương thức của lớp nào. void an() { § 2. Biến, mảng đối tượng putpixel(x, y, getbkcolor()); Như đã nói ở trên, một lớp (sau khi định nghĩa) có thể xem như } một kiểu đối tượng và có thể dùng để khai báo các biến, mảng }; đối tượng. Cách khai báo biến, mảng đối tượng cũng giống như
- khai báo biến, mảng các kiểu khác (như int, float, cấu trúc, d1.x = 100 ; // Gán 100 cho d1.x hợp, ...), theo mẫu sau: d2.y = d1.x; // Gán d1.x cho d2.y Tên_lớp danh sách đối ; Tên_lớp danh sách mảng ; Sử dụng các phương thức Cũng giống như hàm, một phương thức được sử dụng thông Ví dụ sử dụng lớp DIEM ở §1, có thể khai báo các biến, mảng qua lời gọi. Tuy nhiên trong lời gọi phương thức bao giờ cũng DIEM như sau: phải có tên đối tượng để chỉ rõ phương thức thực hiện trên các DIEM d1, d2, d3 ; // Khai báo 3 biến đối tượng d1, d2, d3 thuộc tính của đối tượng nào. Ví dụ lời gọi: DIEM d[20] ; // Khai báo mảng đối tượng d gồm 20 phần d1.nhapsl(); tử sẽ thực hiện nhập số liệu vào các thành phần d1.x, d1.y và d1.m Mỗi đối tượng sau khi khai báo sẽ được cấp phát một vùng nhớ Câu lệnh 97 98 riêng để chứa các thuộc tính của chúng. Chú ý rằng sẽ không có vùng nhớ riêng để chứa các phương thức cho mỗi đối tượng. Các d[3].nhapsl() ; phương thức sẽ được sử dụng chung cho tất cả các đối tượng sẽ thực hiện nhập số liệu vào các thành phần d[3].x, d[3].y và cùng lớp. Như vậy về bộ nhớ được cấp phát thì đối tượng giống d[3].m cấu trúc. Trong trương hợp này: Chúng ta sẽ minh hoạ các điều nói trên bằng một chương trình sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6 đơn giản sử dụng lớp DIEM để nhập 3 điểm, hiện rồi ẩn các sizeof(d) = 20*6 = 120 đ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ạ. Thuộc tính của đối tượng: #include Trong ví dụ trên, mỗi đối tượng d1, d2, d3 và mỗi phần tử d[i] đều có 3 thuộc tính là x, y, m. Chú ý là mỗi thuộc đều thuộc về #include một đối tượng, vì vậy không thể viết tên thuộc một cách riêng rẽ #include mà bao giờ cũng phải có tên đối tượng đi kèm, giống như cách viết class DIEM trong cấu trúc của C hay bản ghi của PASCAL. Nói cách khác, { cách viết thuộc tính của đối tượng như sau: private: tên_đối_tượng.Tên_thuộc_tính int x, y, m ; Với các đối tượng d1, d2, d3 và mảng d, có thể viết như sau: public: d1.x // Thuộc tính x của đối tượng d1 void nhapsl(); d2.x // Thuộc tính x của đối tượng d2 void an() d3.y // Thuộc tính y của đối tượng d3 { d[2].m // Thuộc tính m của phần tử d[2] putpixel(x,y,getbkcolor());
- } d1.nhapsl(); void hien(); d2.nhapsl(); }; d3.nhapsl(); void DIEM::nhapsl() kd_do_hoa(); { cout > x >> y ; d2.hien(); cout > m ; } getch(); d1.an(); void DIEM::hien() d2.an(); { d3.an(); 99 100 int mau_ht; getch(); mau_ht = getcolor() ; closegraph(); putpixel(x,y,m); } setcolor(mau_ht); } § 3. Con trỏ đối tượng void kd_do_hoa() Con trỏ đối tượng dùng để chứa địa chỉ của biến, mảng đối { tượng. Nó được khai báo như sau: int mh, mode ; Tên_lớp *con trỏ ; mh=mode=0; Ví dụ dùng lớp DIEM có thể khai báo: initgraph(&mh, &mode, ""); DIEM *p1 , *p2, *p3 ; // khai báo 3 con trỏ p1, p2, p3 } DIEM d1, d2 ; // Khai báo 2 đối tượng d1, d2 void main() DIEM d[20] ; // Khai báo mảng đối tượng { và có thể thực hiện các câu lệnh: DIEM d1, d2, d3 ; p1 = &d2 ; // p1 chứa địa chỉ của d2 , hay p1 trỏ tới d2 p2 = d ; // p2 trỏ tới đầu mảng d
- p3 = new DIEM // Tạo một đối tượng và chứa địa chỉ của nó int x, y, m ; // vào p3 public: Để sử dụng thuộc tính của đối tượng thông qua con trỏ, ta viết void nhapsl(); như sau: void an() Tên_con_trỏ->Tên_thuộc_tính { Chú ý: Nếu con trỏ chứa địa chỉ đầu của mảng, có thể dùng putpixel(x,y,getbkcolor()); con trỏ như tên mảng. } Như vậy sau khi thực hiện các câu lệnh trên thì: void hien(); p1->x và d2.x là như nhau }; p2[i].y và d[i].y là như nhau void DIEM::nhapsl() { Tóm lại ta có quy tắc sau cout x >> y ; đối tượng ta phải dùng phép . hoặc phép -> . Trong chương trình, không cho phép viết tên thuộc tính một cách đơn độc mà phải đi cout > m ; 101 102 Tên_đối_tượng.Tên_thuộc_tính } Tên_con_trỏ->Tên_thuộc_tính void DIEM::hien() 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 int mau_ht; Chương trình dưới đây cũng sử dụng lớp DIEM (trong §1) để mau_ht = getcolor() ; nhập một dẫy điểm, hiển thị và ẩn các điểm vừa nhập. Chương putpixel(x,y,m); trình dùng một con trỏ kiểu DIEM và dùng toán tử new để tạo ra một dẫy đối tượng. setcolor(mau_ht); #include } #include void kd_do_hoa() #include { class DIEM int mh, mode ; { mh=mode=0; private: initgraph(&mh, &mode, "");
- } cout > m ; { } DIEM *p; Rõ ràng trong phương thức này chúng ta sử dụng tên các thuộc int i, n; tính x, y và m một cách đơn độc. Điều này có vẻ như mâu thuẫn cout > n; như sau: p = new DIEM[n+1]; C++ sử dụng con trỏ đặc biệt this trong các phương thức. Các thuộc tính viết trong phương thức được hiểu là thuộc một đối for (i=1; ix >> this->y ; for (i=1; i this->m ; getch(); } 103 104 closegraph(); Từ góc độ hàm số có thể kết luận rằng: Phương thức bao giờ } cũng có ít nhất một đối là con trỏ this và nó luôn luôn là đối đầu tiên của phương thức. § 4. Đối của phương thức, con trỏ this 4.2. Tham số ứng với đối con trỏ this 4.1. Con trỏ this là đối thứ nhất của phương thức Xét một lời gọi tới phương thức nhapsl() : Chúng ta hãy xem lại phương thức nhapsl của lớp DIEM DIEM d1; void DIEM::nhapsl() d1.nhapsl() ; { Trong trường hợp này tham số truyền cho con trỏ this chính là địa chỉ của d1: cout x >> y ; Do đó:
- this->x chính là d1.x + Bỏ thuộc tính m (mầu) this->y chính là d1.y + Bỏ các phương thức hien và an this->m chính là d1.m +Đưa vào 4 phương thức mới: Như vậy câu lệnh ve_ doan_thang (Vẽ đoạn thẳng qua 2 điểm) d1.nhapsl() ; ve_tam_giac (Vẽ tam giác qua 3 điểm) sẽ nhập dữ liệu cho các thuộc tính của đối tượng d1. Từ đó có thể do_dai (Tính độ dài của đoạn thẳng qua 2 điểm) rút ra kết luận sau: chu_vi (Tính chu vi tam giác qua 3 điểm) Tham số truyền cho đối con trỏ this chính là địa chỉ của đối Chương trình còn minh hoạ: tượng đi kèm với phương thức trong lời gọi phương thức. + Việc phương thức này sử dụng phương thức khác (phương 4.3. Các đối khác của phương thức 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) Ngoài đối đặc biệt this (đối này không xuất hiện một cách tường minh), phương thức còn có các đối khác được khai báo như + Sử dụng con trỏ this trong thân các phương thức ve_tam_giac trong các hàm. Đối của phương thức có thể có kiểu bất kỳ (chuẩn và chu_vi và ngoài chuẩn). Nội dung chương trình là nhập 3 điểm, vẽ tam giác có đỉnh là 3 Ví dụ để xây dựng phương thức vẽ đường thẳng qua 2 điểm ta điểm vừa nhập sau đó tính chu vi tam giác. cần đưa vào 3 đối: Hai đối là 2 biến kiểu DIEM, đối thứ ba kiểu #include nguyên xác định mã mầu. Vì đã có đối ngầm định this là đối thứ #include nhất, nên chỉ cần khai báo thêm 2 đối. Phương thức có thể viết #include như sau: #include 105 106 void DIEM::doan_thang(DIEM d2, int mau) #include { class DIEM int mau_ht; { mau_ht = getcolor(); private: setcolor(mau); int x, y ; public: line(this->x,this->y,d2.x,d2.y); void nhapsl(); setcolor(mau_ht); void ve_doan_thang(DIEM d2, int mau) ; } void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; Chương trình sau minh hoạ các phương thức có nhiều đối. Ta double do_dai(DIEM d2) vẫn dùng lớp DIEM nhưng có một số thay đổi: {
- DIEM d1 = *this ; { return sqrt( pow(d1.x - d2.x,2) + double s; pow(d1.y - d2.y,2) ) ; s= (*this).do_dai(d2) + d2.do_dai(d3) + d3.do_dai(*this) ; } return s; double chu_vi(DIEM d2, DIEM d3); }; } void DIEM::nhapsl() void main() { { cout x >> y ; char tb_cv[20] ; } d1.nhapsl(); void kd_do_hoa() d2.nhapsl(); { d3.nhapsl(); int mh, mode ; kd_do_hoa(); mh=mode=0; d1.ve_tam_giac(d2,d3,15); initgraph(&mh, &mode, ""); double s = d1.chu_vi(d2,d3); } sprintf(tb_cv,"Chu vi = %0.2f", s); void DIEM::ve_doan_thang(DIEM d2, int mau) outtextxy(10,10,tb_cv); { getch(); closegraph(); setcolor(mau); } line(this->x,this->y,d2.x,d2.y); } Một số nhận xét về đối của phương thức và lời gọi 107 108 phương thức void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) + Quan sát nguyên mẫu phương thức: { void ve_doan_thang(DIEM d2, int mau) ; (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); sẽ thấy phương thức có 3 đối: d3.ve_doan_thang(*this,mau); Đối thứ nhât là một đối tượng DIEM do this trỏ tới } Đối thứ hai là đối tượng DIEM d2 Đối thứ ba là biến nguyên mau double DIEM::chu_vi(DIEM d2, DIEM d3)
- Nội dung phương thức là vẽ một đoạn thẳng đi qua các điểm Trong trường này rõ ràng vai trò của this rất quan trọng. Nếu *this và d2 theo mã mầu mau. Xem thân của phương sẽ thấy được không dùng nó thì công việc trơ nên khó khăn, dài dòng và khó nội dung này: hiểu hơn. Chúng ta hãy so sánh 2 phương án: void DIEM::ve_doan_thang(DIEM d2, int mau) Phương án dùng this trong phương thức ve_tam_giac: { void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) setcolor(mau); { line(this->x,this->y,d2.x,d2.y); (*this).ve_doan_thang(d2,mau); } d2.ve_doan_thang(d3,mau); Tuy nhiên trong trương hợp này, vai trò của this không cao lắm, d3.ve_doan_thang(*this,mau); vì nó được đưa vào chỉ cốt làm rõ đối thứ nhất. Trong thân phương } thức có thể bỏ từ khoá this vẫn được. Phương án không dùng this trong phương thức ve_tam_giac: + Vai trò của this trở nên quan trọng trong phương thức void DIEM::ve_tam_giac(DIEM d2, DIEM d3,int mau) ve_tam_giac: { void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; DIEM d1; Phương thức này có 4 đối là: d1.x = x; this trỏ tới một đối tượng kiểu DIEM d1.y = y; d2 một đối tượng kiểu DIEM d1.ve_doan_thang(d2,mau); d3 một đối tượng kiểu DIEM d2.ve_doan_thang(d3,mau); mau một biến nguyên d3.ve_doan_thang(d1,mau); Nội dung phương thức là vẽ 3 cạnh: } cạnh 1 đi qua *this và d2 cạnh 2 đi qua d2 và d3 § 5. Nói thêm về kiểu phương thức và kiểu đối của phương cạnh 3 đi qua d3 và *this Các cạnh trên được vẽ nhờ sử dụng phương thức thức ve_doan_thang: 5.1. Kiểu phương thức 109 110 Vẽ cạnh 1 dùng lệnh: (*this).ve_doan_thang(d2,mau) ; Phương thức có thể không có giá trị trả về (kiểu void) hoặc có Vẽ cạnh 2 dùng lệnh: d2.ve_doan_thang(d3,mau); thể trả về một giá trị có kiểu bất kỳ, kể cả giá trị kiểu đối tượng, con trỏ đối tượng, tham chiếu đối tượng. Vẽ cạnh 3 dùng lệnh: d3.ve_doan_thang(*this,mau);
- 5.2. Đối của phương thức HINH_CN *h; //Con trỏ tới dẫy đối tượng của lớp Đối của phương thức (cũng giống như đối của hàm) có thể có HINH_CN kiểu bất kỳ: - Các phương thức + Kiểu dữ liệu chuẩn như int, float, char,... . Con trỏ hoặc tham void nhapsl(); // Nhập một dẫy hình chữ nhật chiếu đến kiểu dữ liệu chuẩn như int*, float*, char*, int&, float&, HINH_CN hinh_dt_max() ; //Trả về hình chữ nhật có char&,... // diện tích max + Các kiểu ngoài chuẩn đã định nghĩa trước như đối tượng, cấu trúc, hợp, enum,... . Con trỏ hoặc tham chiếu đến các kiểu HINH_CN *hinh_cv_max() ; // Trả về con trỏ tới HCN có ngoài chuẩn này. // chu vi max + Kiểu đối tượng của chính phương thức, con trỏ hoặc tham #include chiếu đến kiểu đối tượng này. #include 5.3. Các ví dụ class HINH_CN Ví dụ 1 minh hoạ: { + Thuộc tính (thành phần dữ liệu) của lớp có thể là đối tượng private: của lớp khác đã định nghĩa bên trên. int d, r; // chieu dai va chieu rong + Phương thức có giá trị trả về kiểu đối tượng và con trỏ đối public: tượng. void nhapsl() Nội dung chương trình là nhập một dẫy hình chữ nhật, sau đó { tìm hình chữ nhật có max diện tích và hình chữ nhật có max chu vi. cout > d >> r ; + Lớp HINH_CN gồm: } - Các thuộc tính: d và r (chiều dài và chiều rộng) void in() - Các phương thức { void nhapsl() ; // Nhập chiều dài, rộng cout
- } if (h[i].dien_tich() > hdtmax.dien_tich() ) int chu_vi() hdtmax = h[i]; { return hdtmax; return 2*(d+r); } } HINH_CN *DAY_HINH_CN::hinh_cv_max() }; { class DAY_HINH_CN int imax = 1; { for (int i=2; i h[imax].chu_vi() ) int n; // So hinh ch nhat imax = i ; HINH_CN *h; return (h+imax); public: } void nhapsl(); HINH_CN hinh_dt_max() ; void main() HINH_CN *hinh_cv_max() ; { }; DAY_HINH_CN d; void DAY_HINH_CN::nhapsl() HINH_CN hdtmax; { d.nhapsl(); cout > n; hdtmax.in() ; h = new HINH_CN[n+1]; HINH_CN *hcvmax=d.hinh_cv_max(); for (int i=1;iin() ; h[i].nhapsl(); getch(); } } HINH_CN DAY_HINH_CN::hinh_dt_max() { Ví dụ 2 minh hoạ: HINH_CN hdtmax; + Thuộc tính (thành phần dữ liệu) của lớp có thể là đối tượng hdtmax = h[1]; của lớp khác đã định nghĩa bên trên. for (int i=2; i
- + Vai trò của con trỏ this (xem phương thức maxdt của lớp + Thuật toán là: TAM_GIAC) - Duyệt qua các tổ hợp 3 điểm. + Phương thức tĩnh (xem phương thức tao_tg của lớp - Dùng phương thức tao_tg để lập tam giác từ 3 điểm TAM_GIAC) - Dùng phương thức maxdt để chọn tam giác có diện tích Nội dung chương trình là nhập một dẫy các điểm, sau đó tìm lớn hơn trong 2 tam giác: tam giác vừa tạo và tam giác có diện tích tam giác lớn nhất (về diện tích) có đỉnh là các điểm vừa nhập. max (trong số các tam giác đã tạo) Chương trình được tổ chức thành 2 lớp: #include + Lớp DIEM gồm: #include - Các thuộc tính: x và y (toạ độ của điểm) #include - Các phương thức class DIEM void nhapsl() ; // Nhập x, y { void in() ; // In toạ độ private: double do_dai(DIEM d2) ; // Tính độ dài đoạn thẳng qua double x,y; // Toa do cua diem // 2 điểm (điểm ẩn xác định bởi this và điểm d2) public: + Lớp TAM_GIAC gồm: - Các thuộc tính: void nhapsl() DIEM d1,d2,d3; // 3 đỉnh của tam giác { - Các phương thức: cout > x >> y ; void in(); // In toạ độ 3 đỉnh } // Tạo một đối tượng TAM_GIAC từ 3 đối tượng DIEM void in() static TAM_GIAC tao_tg(DIEM e1, DIEM e2, DIEM e3) { double dien_tich() ; // Tính diện tích cout
- }; { class TAM_GIAC cout
- for (i=1; i
- public: } void nhapsl() double dien_tich() ; { TAM_GIAC maxdt(TAM_GIAC t2); cout > x >> y ; }; } void TAM_GIAC::nhapsl() void in() { 119 120 cout
- } t=tao_tg(d[i],d[j],d[k]); TAM_GIAC TAM_GIAC::maxdt(TAM_GIAC t2) tmax = tmax.maxdt(t); { } if (this->dien_tich() > t2.dien_tich()) cout
- } Dùng lớp DIEM, ta xây dựng hàm tính độ dài của đoạn thẳng đi qua 2 điểm như sau: Nhận xét: Không cho phép dùng từ khoá friend khi xây dựng hàm (bên ngoài lớp) double do_dai(DIEM d1, DIEM d2) { return sqrt(pow(d1.x-d2.x,2) + pow(d1.y-d2.y,2)); § 6. Hàm, hàm bạn } 6.1. Hàm có các tính chất sau: Hàm này sẽ bị báo lỗi khi dịch, vì trong thân hàm không cho + Phạm vi của hàm là toàn bộ chương trình, vì vậy hàm có thể phép sử dụng các thuộc tính d1.x, d1.y, d2.x, d2.y của các đối được gọi tới từ bất kỳ chỗ nào. Như vây trong các phương thức có tượng d1 và d2 thuộc lớp DIEM. thể sử dụng hàm. + Phạm vi sử dụng của các phương thức (public) là toàn + Đối của hàm có thể là các đối tượng, tuy nhiên có một hạn chương trình, vì vậy trong thân hàm có thể gọi tới các phương chế là trong thân hàm không cho phép truy nhập tới thuộc tính của 123 124 c. Ví dụ giả sử đã định nghĩa lớp: thứ các đối này. Ví dụ giả sử đã định nghĩa lớp: class DIEM class DIEM { { private: private: double x,y; // Toa do cua diem double x,y; // Toa do cua diem public: public: void nhapsl() void nhapsl() { { cout x >> y ; cin >> x >> y ; } } void in() void in() { { cout
- return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); cout > x >> y ; }; } Khi đó bằng cách dùng phương thức do_dai, ta có thể viết hàm void in() tính diện tích tam giác có đỉnh là các đối tượng d1, d2, d3 của lớp { DIEM như sau: cout
- for (i=1; i
- { imax = i ; return sqrt(pow(x-d2.x,2) + pow(y-d2.y,2) ); jmax = j; } kmax = k; double dt_tg(int i, int j, int k) } { cout
CÓ THỂ BẠN MUỐN DOWNLOAD
-
CHƯƠNG 3 - CÁC LỆNH VẼ
29 p |
236 |
112
-
Chương 11: INPUT – OUTPUT TRONG JAVA
87 p |
283 |
105
-
BÀI 3. TIMER
6 p |
225 |
79
-
Lập trình java căn bản - Chương 3: Lớp và đối tượng
61 p |
233 |
66
-
Bài giảng lập trình java - Bài 2
11 p |
102 |
39
-
Khái quát về PHP Framework
16 p |
97 |
29
-
LẬP TRÌNH C nâng cao - bài 3 - nhắc lại về lớp
6 p |
89 |
25
-
Chương 9: DÒNG VÀO/RA (I/O Streams)
22 p |
70 |
19
-
LẬP TRÌNH C nâng cao - bài 3 - nhắc lại về lớp part 2
6 p |
72 |
18
-
Bài giảng Trí tuệ nhân tạo - Chương 3: Các kỹ thuật tìm kiếm Heuristics
35 p |
61 |
17
-
Khái niệm về ontology
9 p |
51 |
11
-
Bài giảng Lập trình căn bản: Chương 1 - ThS. Nguyễn Cao Trí
20 p |
54 |
9
-
Bài giảng Lập trình cơ bản bài 4: Phần mềm máy tính và mạng máy tính
41 p |
32 |
6
-
Bài giảng Ngôn ngữ lập trình C và C++ (Phần 2: Ngôn ngữ lập trình C++) - Chương 6: Mẫu (template)
27 p |
12 |
3
-
Bài giảng Lập trình hướng đối tượng (Dùng C#): Chương 3 - Trần Minh Thái
70 p |
9 |
2
-
Bài giảng Kỹ thuật lập trình: Chương 3 - Trần Thị Kim Chi (tt)
33 p |
8 |
2
-
Bài giảng Chương 3: Vài kiến thức nâng cao về C, C++
40 p |
8 |
0

Set-Cookie: TLDEVNamespace=prq37lr2qkrs1bd136v2q426a1; path=/; domain=.tailieu.vn; HttpOnly