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.
43 trang |
Chia sẻ: thuychi16 | Lượt xem: 823 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Kĩ thuật lập trình - Bài 3: Lớp và đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài 3: Lớp và đối tượngLớ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à structStruct 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 dungTạ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 publicSử 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 staticTìm hiểu con trỏ this.Đa hìnhKhai báo một classKhai 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ệuNgầm định là privateprivate: trong phạm vi lớp đópublic: ở mọi nơi nếu đối tượng tồn tạiChú ý: 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.protected: phạm vi lớp đó và các lớp con kế thừa Khai báo một classStudent aSophomore;aSophomore.idNum = 7645;cout ;Chú ý: không được khởi tạo giá trị ban đầuKiểu dữ liệu có thể là kiểu cơ bản hoặc kiểu do người dùng định nghĩaĐóng gói các thành phần của một lớp10/20Khai báo thành phầnHàm thành phầnCá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Đó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ớpVí 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, ĐtbPhương thức: nhập, tính đtb, in Lớp sinh viênVí dụVí dụ 2Xâ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ềnPhương thức: nhập, tính thành tiền, in Lớp các hóa đơnVí dụVí dụ 3Xâ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ượngCú pháp: ;Ví dụ: khai báo 2 đối tượng sinh viênSV sv1, sv2;Khi đó sv1, sv2 là hai đối tượng sinh viênTruy xuất đối tượng.;Ví dụ: truy xuất họ tên và ngày sinh của svsv1.ht;sv2.ns;Nếu là con trỏ: ->;18/20Hà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.19/20Hàm khởi tạoKhai báo:([ds tham số]);Định nghĩa ngoài lớp:::([ds tham số]){//thân hàm}Dùng hàm tạo để khởi gán các giá trị thuộc tính cho đối tượngClass 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ạoNhư vậy hàm khởi tạo:Có với mọi lớpTên hàm giống tên lớpKhông có kiểu nên không cần khai báoKhô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ớpHà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épKhi trong lớp có thuộc tính con trỏ hoặc tham chiếu.Ví dụClass DT{int n; //Bac cua da thucdouble *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;ia[i] = d.a[i];}Hàm hủyKhai 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ạipublic:~DT(){this->n=0; delete this->a;}Hàm hủy28/20Như vậy hàm hủy:Không có đối sốKhông có giá trị trả vềKhông định nghĩa lạiTrùng tên với lớp và có dấu ~ ở trướcThự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 địnhKhai báo các thành viên của lớp là staticKhi 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 staticThuộ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ỏ thisCon 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 = &d1Con trỏ thisSử 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ênXem Ví dụ 4.2- PVAHà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áchCá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ínhpublic:...// Khai báo các hàm bạn của lớp Afriend 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áchCá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ựcdouble b; // Phần ảopublic:SP cong(SP u2){SP u:u.a = this->a + u2.a ;u.b = this->b + u2.b ;return u;}} ;Cách dùngSP 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ựcdouble 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ùngSP 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ất43/20 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