LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 5 docx

10 273 0
LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG - Chương 5 docx

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

Thông tin tài liệu

1 Chương 5: TẠO ĐỐI TƯỢNG Giáo viên: Võ Hồng Bảo Châu Khoa CNTT trường ĐH Lạc Hồng LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG MỤC TIÊUMỤC TIÊU • Nắm rõ hơn về các trường hợp tạo đối tượng. • Hiểu và sử dụng con trỏ this • Hiểu được khái niệm static, viết một vài chương trình sử dụng biến và phương thức static. • Nắm vững khái niệm và cách sử dụng hàm friend 2 OOP-CHƯƠNG 5-TAO DOI TUONG NỘI DUNG CHI TIẾTNỘI DUNG CHI TIẾT • CÁCH KHAI BÁO BIẾN • CÁCH CẤP PHÁT BỘ NHỚ • ĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA LỚP • CON TRỎ THIS • LỚP CÓ DỮ LIỆU STATIC • HÀM FRIEND • CON TRỎ THIS 3 OOP-CHƯƠNG 5-TAO DOI TUONG TẠO 1 ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾNTẠO 1 ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN • Dùng phương thức thiết lập chuẩn Ví dụ: VECTOR a; • Sử dụng phương thức thiết lập có tham số Ví dụ: VECTOR a(10), b(10,3.5); • Tạo đối tượng từ đối tượng đã có – Tạo bản sao Ví dụ: VECTOR a; VECTER b(a) VECTOR a; VECTOR b = a; 4 OOP-CHƯƠNG 5-TAO DOI TUONG 2 TẠO NHIỀU ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾNTẠO NHIỀU ĐỐI TƯỢNG BẰNG CÁCH KHAI BÁO BIẾN • Sử dụng phương thức thiết lập chuẩn Ví dụ: VECTOR a[5]; • Sử dụng phương thức thiết lập có một tham số Ví dụ: VECTOR a[2]={10,20}; • Sử dụng phương thức thiết lập nhiều tham số Ví dụ: VECTOR a[2]={VECTOR(10,3.5),VECTOR(20,1.6}; 5 OOP-CHƯƠNG 5-TAO DOI TUONG Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp • Đối tượng có thể là thành phần của đối tượng khác, khi một đối tượng thuộc lớp “lớn” được tạo ra, các thành phần của nó cũng được tạo ra. Phương thức thiết lập (nếu có) sẽ được tự động gọi cho các đối tượng thành phần. • Nếu đối tượng thành phần phải được cung cấp tham số khi thiết lập thì đối tượng kết hợp (đối tượng lớn) phải có phương thức thiết lập để cung cấp tham số thiết lập cho các đối tượng thành phần. 6 OOP-CHƯƠNG 5-TAO DOI TUONG VÍ DỤVÍ DỤ class Diem{ double x,y; public: Diem(double xx, double yy) {x = xx; y = yy;} // }; class TamGiac{ Diem A,B,C; public: // }; void main(){ TamGiac t; // Bao sai 7 OOP-CHƯƠNG 5-TAO DOI TUONG Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp • Cú pháp để khởi tạo đối tượng thành phần là dùng dấu hai chấm (:) theo sau bởi tên thành phần và tham số khởi tạo. • Khi đối tượng kết hợp bị huỷ đi thì các đối tượng thành phần của nó cũng bị huỷ đi, nghĩa là phương thức huỷ bỏ sẽ được gọi cho các đối tượng thành phần, sau khi phương thức huỷ bỏ của đối tượng kết hợp được gọi. 8 OOP-CHƯƠNG 5-TAO DOI TUONG 3 class Diem { double x,y; public: Diem(double xx, double yy {x = xx; y = yy;} // }; class TamGiac { Diem A,B,C; public: TamGiac(double xA, double yA, double xB, double yB, double xC, double yC):A(xA,yA),B(xB,yB),C(xC,yC){} void Ve() const; // }; void main(){ TamGiac t(100,100,200, 400,300,300); } VÍ DỤ KHỞI TẠO ĐỐI TƯỢNG THÀNH PHẦN, DÙNG DẤU HAI CHẤM Đối tượng thành phần 9 OOP-CHƯƠNG 5-TAO DOI TUONG Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp • Khi đó trình tự thực hiện của các phương thức thiết lập và phương thức hủy bỏ theo quy tắc sau: – Phương thức thiết lập của các lớp thành phần được thực hiện trước phương thức thiết lập của lớp – Phương thức hủy bỏ của lớp thành phần thực hiện sau phương thức hủy bỏ của lớp, – Trong các thành phần của lớp, thành phần nào được khai báo trước, phương thức thiết lập sẽ thực hiện trước. – Trong các thành phần của lớp, thành phần nào được khai báo trước, phương thức hủy bỏ sẽ thực hiện sau. 10 OOP-CHƯƠNG 5-TAO DOI TUONG ĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA MẢNGĐỐI TƯỢNG LÀ THÀNH PHẦN CỦA MẢNG • Sử dụng mảng các đối tượng là một cách tiếp cận truyền thống. • Tuy nhiên, – Có thể sử dụng mảng các đối tượng của lớp ngay chính trong lớp 11 OOP-CHƯƠNG 5-TAO DOI TUONG Ví dụVí dụ class SEQUENCE{ double data; public: SEQUENCE(); SEQUENCE( SEQUENCE*, int ); void reorder( SEQUENCE*, int ); void out( SEQUENCE*, int ); }; 12 OOP-CHƯƠNG 5-TAO DOI TUONG 4 Từ đóTừ đó class MAIN{ SEQUENCE *u; public: MAIN( int = 2 ); ~MAIN(); }; MAIN::MAIN( int size ){ u = new SEQUENCE[size]; SEQUENCE a(u,size); a.reorder( u, size ); a.out( u, size ); } MAIN::~MAIN(){ delete []u; } 13 OOP-CHƯƠNG 5-TAO DOI TUONG void main() { MAIN object(5); } 14 OOP-CHƯƠNG 5-TAO DOI TUONG TẠO MẢNG TẠO PTỬ 1 TẠO PTỬ 2 …TẠO PTỬ 3 Gọi PHƯƠNG THỨC THIẾT LẬP Gọi Gọi Gọi PHƯƠNG THỨC THIẾT LẬP PHƯƠNG THỨC THIẾT LẬP PHƯƠNG THỨC THIẾT LẬP CÁC PHẦN TỬ PHẢI CÓ KHẢ NĂNG TỰ KHỞI TẠO - Lớp không có phương thức thiết lập. – Lớp có phương thức thiết lập không tham số. – Lớp có phương thức thiết lập mà mọi tham số đều có giá trị mặc nhiên 15 OOP-CHƯƠNG 5-TAO DOI TUONG class Diem { double x,y; public: Diem(double xx, double yy): x(xx), y(yy) {} void Set(double xx, double yy) {x = xx, y = yy;} // }; class String { char *p; public: String(char *s) {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() { cout << "delete "<< (void *)p << "\n"; delete [] p; } // class SinhVien { String MaSo; String HoTen; int NamSinh; public: SinhVien(char *ht, char *ms, int ns):HoTen(ht), MaSo(ms), NamSinh(ns){} // }; String as[3]; // Bao sai Diem ad[5]; // Bao sai SinhVien asv[7]; // Bao sai 16 OOP-CHƯƠNG 5-TAO DOI TUONG 5 class Diem { double x,y; public: Diem(double xx = 0, double yy = 0):x(xx), y(yy){} void Set(double xx, double yy) {x = xx, y = yy;} // }; class String { char *p; public: String(char *s = “”) {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {cout << "delete "<< (void *)p << "\n"; delete [] p; } class SinhVien{ String MaSo; String HoTen; int NamSinh; public: SinhVien(char *ht = “Nguyen Van A”, char *ms =“19920014”, int ns = 1982):HoTen(ht), MaSo(ms), NamSinh(ns){} // }; String as[3]; // Ok: Ca ba phan tu deu la chuoi rong Diem ad[5]; // Ok: ca 5 diem deu la (0,0) SinhVien asv[7]; // Ok: Het sai ca 7 sinh vien deu co cung ten, ma so, nam sinh Dùng phương thức thiết lập với tham số có giá trị mặc định 17 OOP-CHƯƠNG 5-TAO DOI TUONG class Diem { double x,y; public: Diem(double xx, double yy): x(xx), y(yy){} Diem():x(0), y(0){} // }; class String { char *p; public: String(char *s) {p = strdup(s);} String() {p = strdup(“”);} ~String() {cout << "delete "<< (void *)p << "\n"; delete [] p; } class SinhVien { String MaSo; String HoTen; int NamSinh; public: SinhVien(char *ht, char *ms, int ns):HoTen(ht),MaSo(ms), NamSinh(ns){} SinhVien():HoTen(“Nguyen Van A”), MaSo(“19920014”),NamSinh(1982){} // }; String as[3]; // Ca ba phan tu deu la chuoi rong Diem ad[5]; // ca 5 diem deu la (0,0) SinhVien asv[7];// Ca 7 sinh vien deu co cung hoten,maso, namsinh Dùng phương thức thiết lập không tham số 18 OOP-CHƯƠNG 5-TAO DOI TUONG ĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNGĐỐI TƯỢNG ĐƯỢC CẤP PHÁT ĐỘNG • Đối tượng được cấp phát động là các đối tượng được tạo ra bằng phép toán new và bị huỷ đi bằng phép toán delete • Phép toán new cấp đối tượng trong vùng heap (hay vùng free store) và gọi phương thức thiết lập cho đối tượng được cấp. • Dùng new có thể cấp một đối tượng và dùng delete để huỷ một đối tượng. • Dùng new và delete cũng có thể cấp nhiều đối tượng và huỷ nhiều đối tượng 19 OOP-CHƯƠNG 5-TAO DOI TUONG CẤP VÀ HỦY 1 ĐỐI TƯỢNGCẤP VÀ HỦY 1 ĐỐI TƯỢNG class Diem { double x,y; public: Diem(double xx, double yy):x(xx),y(yy){}; // }; class String { char *p; public: String(char *s) {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} // }; int *pi = new int; int *pj = new int(15); Diem *pd = new Diem(20,40); String *pa = new String("Nguyen Van A"); // delete pa; delete pd; delete pj; delete pi; Cấp và hủy một đối tượng 20 OOP-CHƯƠNG 5-TAO DOI TUONG 6 CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNGCẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG • Trong trường hợp cấp nhiều đối tượng, ta không thể cung cấp tham số cho từng phần tử được cấp: • int *pai = new int[10]; • Diem *pad = new Diem[5]; // Bao sai • String *pas = new String[5]; // Bao sai • Lỗi trên được khắc phục bằng cách cung cấp phương thức thiết lập để đối tượng có khả năng tự khởi tạo. 21 OOP-CHƯƠNG 5-TAO DOI TUONG CẤP VÀ HỦY NHIỀU ĐỐI TƯỢNGCẤP VÀ HỦY NHIỀU ĐỐI TƯỢNG class String { char *p; public: String(char *s = "Alibaba") {p = strdup(s);} String(const String &s) {p = strdup(s.p);} ~String() {delete [] p;} // }; class Diem { double x,y; public: Diem(double xx, double yy):x(xx),y(yy){}; Diem():x(0),y(0){}; // } Khi đó mọi phần tử được cấp đều được khởi động với cùng giá trị int *pai = new int[10]; Diem *pad = new Diem[5]; // ca 5 diem co cung toa do (0,0) String *pas = new String[5]; // Ca 5 chuoi cung duoc khoi dong bang “Alibaba” • Việc huỷ nhiều đối tượng được thực hiện bằng cách dùng delete và có thêm dấu [] ở trước. – delete [] pas; – delete [] pad; – delete [] pai; 22 OOP-CHƯƠNG 5-TAO DOI TUONG CON TRỎ THISCON TRỎ THIS • Mỗi đối tượng có một con trỏ chỉ đến bản thân nó gọi là con trỏ this. • Lưu trữ địa chỉ của đối tượng đang tác động. • Tham chiếu đến đối tượng đang gọi hàm thành phần. • Khi viết y=1 tương đương this->y=1 hoặc (*this).y=1 Class VIDU{ int n; public: int PhuongThuc(int); }; Int VIDU::PhuongThuc(int n){ this->n=n //chẳng lẽ viết n=n; return (*this).n+n+5; } //(*this).n là dữ liệu thành viên của lớp 23 OOP-CHƯƠNG 5-TAO DOI TUONG VÍ DỤVÍ DỤ t=? 24 OOP-CHƯƠNG 5-TAO DOI TUONG 7 Lớp có dữ liệu staticLớp có dữ liệu static • Nhằm để các đối tượng của lớp cùng chia sẻ vùng bộ nhớ • Dữ liệu static còn gọi là thành viên tĩnh của lớp. • Trong ngôn ngữ lập trình hướng đối tượng, loại thành viên này thường được gọi là biến lớp (class variables) • Từ đó có thể sử dụng nó mà không cần tạo đối tượng thuộc lớp. • Do các đối tượng cùng nhau chia sẻ biến static này, nên nó phải được khai báo như biến toàn cục • Giống như 2 người (2 đối tượng) hùn tiền mua 1 món đồ nên 2 người có thể xài chung món đồ đó 25 OOP-CHƯƠNG 5-TAO DOI TUONG Biến count được khai báo static để liên hệ các đối tượng với nhau. Mỗi lần tạo 1 đối tượng thì biến count tăng 1, hủy 1 đối tượng thì biến count giảm 1. Thay a bằng bất kỳ đối tượng nào, kết quả cũng như nhau 26 OOP-CHƯƠNG 5-TAO DOI TUONG Lớp có phương thức staticLớp có phương thức static • Phương thức static là phương thức có thể gọi thực hiện ngay cả khi chưa tạo đối tượng thuộc lớp. • Phương thức static là phương thức để cho các đối tượng của lớp cùng chia sẻ. • Chẳng hạn, như trong ví dụ trên, phương thức numberPerson(). 27 OOP-CHƯƠNG 5-TAO DOI TUONG Phương thức static, các đối tượng của lớp cùng chia sẻ Không cần chỉ định đối tượng cũng có thể gọi được hàm static 28 OOP-CHƯƠNG 5-TAO DOI TUONG 8 BÀI TẬP TẠI LỚPBÀI TẬP TẠI LỚP  Xem chương trình sau, cho biết những gì sẽ xuất ra màn hình khi chạy chương trình: int a=1, b=2; class test{ int count; public: test(){ count++;} static int GetCount(){ return a+b; } }; void main(){ cout<<test::GetCount()<<endl;} 29 OOP-CHƯƠNG 5-TAO DOI TUONG BÀI TẬP TẠI LỚPBÀI TẬP TẠI LỚP Cho đoạn chương trình sau: main(){ cout<<“Xin chao cac ban”; getch(); } Hãy sửa lại chương trình trên sao cho chương trình in ra màn hình: Bat dau in cau thong bao… Xin chao cac ban Ket thuc in thong bao… Nhưng không được sửa chữa gì hàm main 30 OOP-CHƯƠNG 5-TAO DOI TUONG HÀM FRIENDHÀM FRIEND Mai Trúc Lan Nhà của tôi là tài sản riêng (private), không ai được vào. Trúc là bạn tôi Vậy là tôi được vào nhà của Mai Tôi không được vào nhà của Mai Friend 31 OOP-CHƯƠNG 5-TAO DOI TUONG CÁC KIỂU FRIENDCÁC KIỂU FRIEND • Hàm tự do là friend của 1 lớp • Hàm thành phần của một lớp là bạn của một lớp khác • Hàm bạn của nhiều lớp • Tất cả các hàm thành phần của một lớp là bạn của một lớp khác 32 OOP-CHƯƠNG 5-TAO DOI TUONG 9 Hàm tự do là friend của 1 lớpHàm tự do là friend của 1 lớp Hàm kt_trung là hàm tự do (không thuộc class nào) nên không thể truy cập vào thành phần private (x và y) của class point 33 OOP-CHƯƠNG 5-TAO DOI TUONG Hàm kt_trung là hàm tự do (không thuộc class nào) nhưng là bạn (friend) của class point nên có thể truy cập vào thành phần private (x và y) của class point 34 OOP-CHƯƠNG 5-TAO DOI TUONG Hàm thành phần của một lớp là bạn của một lớp khácHàm thành phần của một lớp là bạn của một lớp khác class A { … } class B { … int f(….); … } Hàm f muốn truy xuất thành phần private và protect của class A Vậy hàm f của B phải được A coi như bạn (friend) class A; class B { …. int f(….) …. }; class A { … friend int B::f(…); … }; int B::f(….) { ……. } 35 OOP-CHƯƠNG 5-TAO DOI TUONG Hàm bạn của nhiều lớpHàm bạn của nhiều lớp class A{ …. friend void f(A,B) …. }; class B{ … friend void B f(A,B); … }; void f(A,B){ ……. //truy xuất thành phần riêng của 2 lớp A và B } class A { … } class B { … } Hàm f muốn truy xuất thành phần private và protect của class A và B void f(A,B) 36 OOP-CHƯƠNG 5-TAO DOI TUONG 10 Tất cả các hàm thành phần của một lớp là bạn của một lớp khácTất cả các hàm thành phần của một lớp là bạn của một lớp khác • Khi không những chỉ một hàm nào đó, mà các hành vi của lớp được quyền truy cập đến những thành viên có thuộc tính private, protected của một lớp khác • Chẳng hạn, các hành vi của lớp A, muốn truy cập những thành viên private, protected của lớp B, thì trong lớp B phải mô tả lớp A có thuộc tính là friend. 37 OOP-CHƯƠNG 5-TAO DOI TUONG class A{ // public: friend class B; // }; class B{ // }; 38 OOP-CHƯƠNG 5-TAO DOI TUONG TÓM TẮTTÓM TẮT • Tạo đối tượng giống như khai báo biến. Đối tượng có thể là thành phần của lớp hoặc thành phần của mảng. • Cú pháp để khởi tạo đối tượng thành phần là dùng dấu hai chấm (:) theo sau bởi tên thành phần và tham số khởi tạo. • Mỗi đối tượng có một con trỏ chỉ đến bản thân nó gọi là con trỏ this. Con trỏ này có thể sử dụng tường minh hoặc ngầm định. • Thành phần dữ liệu tĩnh thể hiện các thông tin dùng chung trong tất cả các đối tượng thuộc lớp. Khai báo thành phần tĩnh bắt đầu bằng từ khóa static. • Hàm friend của một lớp là hàm không thuộc lớp nhưng có quyền truy cập đến các thành phần private của lớp. Khai báo friend có thể đặt bất kỳ nơi nào trong khai báo lớp. 39 OOP-CHƯƠNG 5-TAO DOI TUONG THANK YOU 40 OOP-CHƯƠNG 5-TAO DOI TUONG . DỤ KHỞI TẠO ĐỐI TƯỢNG THÀNH PHẦN, DÙNG DẤU HAI CHẤM Đối tượng thành phần 9 OOP-CHƯƠNG 5- TAO DOI TUONG Đối tượng là thành phần của lớpĐối tượng là thành phần của lớp • Khi đó trình tự thực. thiết lập cho đối tượng được cấp. • Dùng new có thể cấp một đối tượng và dùng delete để huỷ một đối tượng. • Dùng new và delete cũng có thể cấp nhiều đối tượng và huỷ nhiều đối tượng 19 OOP-CHƯƠNG. friend. 37 OOP-CHƯƠNG 5- TAO DOI TUONG class A{ // public: friend class B; // }; class B{ // }; 38 OOP-CHƯƠNG 5- TAO DOI TUONG TÓM TẮTTÓM TẮT • Tạo đối tượng giống như khai báo biến. Đối tượng có

Ngày đăng: 11/07/2014, 20:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan