Bài giảng Công nghệ phần mềm - Bài 3: Lớp và đối tượng - Phạm Thị Bích Vân
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Công nghệ phần mềm - Bài 3: Lớp và đối tượng - Phạm Thị Bích Vân", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_cong_nghe_phan_mem_bai_3_lop_va_doi_tuong_pham_thi.pptx
Nội dung text: Bài giảng Công nghệ phần mềm - Bài 3: Lớp và đối tượng - Phạm Thị Bích Vân
- Bài 3: Lớp và đối tượng
- Lớp (class) • Lớp là khái niệm trung tâm của lập trình hướng đối tượng. Là sự mở rộng của struct trong C. • Lớp là khái niệm trừu tượng, để biểu diễn các đối tượng. Là một kiểu dữ liệu do người dùng định nghĩa. ▫ Lớp đưa ra miêu tả cho các đối tượng. ▫ Lớp cung cấp một cách thuận tiện để nhóm các dữ liệu và các hàm xử lý trên dữ liệu đó. ▫ Khi tạo ra một đối tượng là thể hiện của lớp. Khi đó tự động tạo ra các trường có liên quan. • Lớp chính là một kiểu dữ liệu do người dùng định nghĩa.
- So sánh giữa class và struct • Struct và class đều là kiểu dữ liệu do người dùng định nghĩa ( đều chứa các biến và hàm). • Struct là kiểu dữ liệu tham trị được lưu trong Stack. Trong khi lớp là kiểu dữ liệu tham chiếu được lưu trong heap. • Struct không hỗ trợ kế thừa, lớp có hỗ trợ kế thừa. • Struct phù hợp với các cấu trúc dữ liệu nhỏ. Lớp phù hợp với các cấu trúc dữ liệu phức tạp. • Struct được khởi tạo không cần từ khóa new. Khởi tạo lớp cần từ khóa new. • Khi struct được khởi tạo với từ khóa new, khi đó một constructor (hàm khởi dựng) được gọi để khởi tạo các trường trong cấu trúc. • Khi struct được khởi tạo không dùng từ khóa new thì không có constructor được gọi, do vậy người dùng cần khởi tạo tất cả các trường trước khi sử dụng.
- Nội dung • Tạo các lớp. • Cách đóng gói các thành phần vào lớp. • Thực thi các hàm của lớp. • Sử dụng hàm private và dữ liệu public • Sử dụng các toán tử định phạm vi truy cập đối với các biến và hàm. • Khai báo static • Tìm hiểu con trỏ this. • Đa hình
- Khai báo một class • Khai báo. class { [quyền truy xuất:] //khai báo các thành phần dữ liệu của lớp [quyền truy xuất:] //khai báo các thành phần hàm của lớp };
- Khai báo một class [quyền truy xuất:] § Là khả năng truy xuất thành phần dữ liệu § Ngầm định là private private: trong phạm vi lớp đó public: ở mọi nơi nếu đối tượng tồn tại protected: phạm vi lớp đó và các lớp con kế thừa Chú ý: Các thuộc tính thành viên của struct cũng có thể được thiết lập là private, public hoặc protected.
- Khai báo một class Student aSophomore; aSophomore.idNum = 7645; Error! By default, all members of a cout<<aSophomore.idNum; class are private
- Khai báo một class Access modifier
- Đóng gói các thành phần của một lớp Khai báo thành phần § Dữ liệu: Tương tự như khai báo biến ; Kiểu dữ liệu có thể là kiểu cơ bản hoặc kiểu do người dùng định nghĩa Chú ý: không được khởi tạo giá trị ban đầu 9/20
- Đóng gói các thành phần của một lớp Khai báo thành phần § Hàm thành phần Cách 1: Khai báo trong lớp và định nghĩa ngoài lớp tênlớp:: ([đối sô]) { // } Cách 2: định nghĩa ngay trong lớp 10/20
- Đóng gói các thành phần của một lớp
- Đóng gói các thành phần của một lớp
- Ví dụ Ví dụ 1: Xây dựng cấu trúc dữ liệu mô tả sinh viên: Dữ liệu: họ tên, ngày sinh, giới tính, Điểm toán, lý, hóa, Đtb Phương thức: nhập, tính đtb, in Lớp sinh viên
- Ví dụ Ví dụ 2 Xây dựng cấu trúc dữ liệu mô tả các hóa đơn: Dữ liệu: mã vật tư, tên vật tư, loại phiếu, ngày lập, khối lượng, đơn giá, thành tiền Phương thức: nhập, tính thành tiền, in Lớp các hóa đơn
- Ví dụ Ví dụ 3 Xây dựng cấu trúc dữ liệu mô tả các phân số: Dữ liệu: tử số, mẫu số Phương thức: nhập, tối giản, in Lớp các phân số
- Khai báo đối tượng Cú pháp: ; Ví dụ: khai báo 2 đối tượng sinh viên SV sv1, sv2; Khi đó sv1, sv2 là hai đối tượng sinh viên
- Truy xuất đối tượng . ; Ví dụ: truy xuất họ tên và ngày sinh của sv sv1.ht; sv2.ns; Nếu là con trỏ: -> ;
- Hàm khởi tạo (constructor) • Hàm khởi tạo là một phương thức đặc biêt của lớp. • Hàm khởi tạo được thực thi mỗi khi khởi tạo một đối tượng. • Chú ý: • Tên của hàm khởi tạo phải trùng với tên lớp. • Không có khai báo kiểu cho hàm tạo. • Hàm tạo có thể có tham số hoặc không có tham số. • Có thể nạp chồng nhiều hàm tạo. 18/20
- Hàm khởi tạo Khai báo: ([ds tham số]); Định nghĩa ngoài lớp: :: ([ds tham số]) { //thân hàm } 19/20
- Dùng hàm tạo để khởi gán các giá trị thuộc tính cho đối tượng Class Diem { int x; int y; Diem(int x, int y); }; Diem::Diem(int x, int y) { this->x=x; this->y=y; } int main() { Diem A(0,0); return 0; }
- Dùng hàm tạo trong cấp phát bộ nhớ • Dùng hàm tạo trong cấp phát bộ nhớ Diem *q=new Diem(0,0); int n=20; Diem *q= new Diem[n]; • Dùng hàm tạo trong biểu diễn đối tượng hằng. • Diem(2,4); //Coi nhu mot doi tuong co cac gia tri thuoc tinh x=2,y=4. • Giả sử lớp Diem có phương thức in() , khi đó có thể gọi phương thức đó như sau: • Diem(2,4).in();
- Hàm khởi tạo Như vậy hàm khởi tạo: üCó với mọi lớp üTên hàm giống tên lớp üKhông có kiểu nên không cần khai báo üKhông có giá trị trả về üNếu không xây dựng thì chương trình tự động sinh hàm khởi tạo mặc định. Nếu đã có một hàm khởi tạo trong lớp thì hàm khởi tạo mặc định sẽ không được sinh ra. üĐược gọi tự động khi khai báo thể hiện của lớp
- Hàm khởi tạo sao chép (copy constructor) • Giả sử có class PS: • PS u; • PS v(u) ; // Tạo v theo u • ý nghĩa của câu lệnh này như sau: • Nếu trong lớp PS chưa có hàm tạp sao chép thì sẽ gọi đến hàm tạo sao chép mặc định trong C++. Hàm này sẽ sao chép toàn bộ nội dung của u vào v. • Nếu trong PS đã có hàm tạo sao chép. Khi đó sẽ gọi tới hàm tạo sao chép để khởi tạo v theo u.
- Hàm khởi tạo sao chép (copy constructor) • Cách xây dựng một hàm tạo sao chép. Tên_lớp (const Tên_lớp & dt) { // Các câu lệnh dùng các thuộc tính của đối tượng dt // để khởi gán cho các thuộc tính của đối tượng mới } • Ví dụ PS (const PS &p) { this->t = p.t ; this->m = p.m ; }
- Hàm khởi tạo sao chép (copy constructor) • Khi nào cần dùng hàm tạo sao chép • Khi trong lớp có thuộc tính con trỏ hoặc tham chiếu. • Ví dụ • Class DT { int n; //Bac cua da thuc double *a; } • Khi đó DT u; DT v(u); => Khi đó hai con trỏ u.a và v.a cùng trỏ đến một vùng nhớ.
- Hàm khởi tạo sao chép (copy constructor) • => Phải khởi tạo hàm tạo sao chép sau: DT::DT(const DT &d) { this->n = d.n; this->a = new double[d.n+1]; for (int i=0;i a[i] = d.a[i]; }
- Hàm hủy Khai báo: ~ (); Chức năng: - Hủy bỏ, giải phóng các đối tượng khi nó hết phạm vi tồn tại public: ~DT() { this->n=0; delete this->a; }
- Hàm hủy Như vậy hàm hủy: üKhông có đối số üKhông có giá trị trả về üKhông định nghĩa lại üTrùng tên với lớp và có dấu ~ ở trước üThực hiện một số công việc trứơc khi hệ thống giải phóng bộ nhớ üChương trình dịch tự động sinh hàm hủy mặc định 28/20
- Khai báo các thành viên của lớp là static • Khi khai báo một thành viên là static, khi đó chỉ có một địa chỉ ô nhớ được truy cập. • Khi khởi tạo một đối tượng, thành phần static sẽ được lưu giá trị của đối tượng trước đó. • Các thành viên static được truy cập thông qua tên lớp.
- Thuộc tính static
- Thuộc tính static (tiếp) • Các biến static đôi khi được gọi là class variables, class fields, hoặc class-wide fields bởi vì chúng không phải là biến của đối tượng mà tồn tại theo lớp.
- Các hàm static • Một hàm static có thể được dùng mà không cần khởi tạo một đối tượng. • Các hàm không phải static có thể truy cập được các biến static. • Các hàm static không thể truy cập được các biến không phải static.
- Các hàm static (tiếp)
- Con trỏ this • Con trỏ this chứa địa chỉ ô nhớ của đối tượng hiện tại đang sử dụng hàm. • Con trỏ this sẽ tự động được tạo ra (là địa chỉ của đối tượng) khi gọi đến một phương thức non-static của lớp. DIEM d1; 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: this = &d1
- Con trỏ this • Sử dụng con trỏ this để phân biệt giữa biến của lớp và biến cục bộ của phương thức có cùng tên • Xem Ví dụ 4.2- PVA
- Hàm bạn (friend function) • Phân biệt hàm và phương thức. • Hàm có phạm vi trong toàn bộ chương trình. • Đối vủa hàm có thể là một đối tượng, nhưng trong thân hàm không cho truy cập tới các thuộc tính của đối (nếu thuộc tính là private).
- Hàm bạn (friend function) • Cách khai báo hàm bạn: Có hai cách • Cách 1: Dùng từ khoá friend để khai báo hàm trong lớp và xây dựng hàm bên ngoài như các hàm thông thường (không dùng từ khoá friend). class A { private: // Khai báo các thuộc tính public: // Khai báo các hàm bạn của lớp A friend void f1( ); friend double f2( ); }; void f1() { . }
- Hàm bạn (friend function) • Cách khai báo hàm bạn: Có hai cách • Cách 2: Dùng từ khoá friend để xây dựng hàm trong định nghĩa lớp.
- Hàm bạn (friend function) • Tính chất của hàm bạn. ▫ Trong thân hàm bạn của một lớp có thể truy cập tới thuộc tính của các đối tượng thuộc lớp. ▫ Hàm bạn không phải phương thức của lớp. ▫ Lời gọi của hàm bạn giống lời gọi của hàm thông thường. • Ví dụ: ▫ Xây dựng lớp số phức. Thuộc tính: Phần thực, phần ảo. Nạp chồng hàm khởi tạo. Phương thức: Cộng hai số phức.
- Hàm bạn (friend function) § Cách 1: Xây dựng phương thức “cong”. SP { private: double a; // Phần thực double b; // Phần ảo public: SP cong(SP u2) { SP u: u.a = this->a + u2.a ; u.b = this->b + u2.b ; return u; } } ; Cách dùng SP u, u1, u2; u = u1.cong(u2);
- Hàm bạn (friend function) § Cách 2: Xây dựng hàm bạn “cong”. class SP { private: double a; // Phần thực double b; // Phần ảo public: friend SP cong(SP u1, SP u2) { SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; } }; Cách dùng SP u, u1, u2; u = cong(u1, u2);
- Hàm bạn (friend function) § Một hàm có thể là bạn của nhiều lớp. § Khi đó có thể truy cập được tất cả các thuộc tính của các lớp. § Hàm bạn không phải là hàm thành viên nên không bị ảnh hưởng của từ khoá truy xuất § Không hạn chế số lượng hàm bạn § Hàm bạn của một lớp có thể là hàm tự do 43/20