Bài giảng Lập trình hướng đối tượng - Bài 3: Lớp và đối tượng - Phạm Thị Bích Vân

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.

 

pptx 43 trang yennguyen 2200
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình hướng đối tượng - 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 hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình hướng đối tượng - Bài 3: Lớp và đối tượng - Phạm Thị Bích Vân

Bài giảng Lập trình hướng đối tượng - 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 
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. 
protected : phạm vi lớp đó và các lớp con kế thừa 
Khai báo một class 
Student aSophomore; 
aSophomore.idNum = 7645; 
cout<<aSophomore.idNum; 
Error! By default, all members of a 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 
9 /20 
Khai báo thành phần 
Dữ liệu: 
Tương tự như khai báo biến 
 ; 
Chú ý : không được khởi tạo giá trị ban đầu 
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 
Đóng gói các thành phần của một lớp 
10 /20 
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 
Đó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ỏ: ->; 
18 /20 
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. 
19 /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 
} 
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; 
} 
i nt 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); 
i nt 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<=d.n;++i) 
this->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 
28 /20 
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 
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(...); 
}; 
v oid 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 
43 /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 

File đính kèm:

  • pptxbai_giang_lap_trinh_huong_doi_tuong_bai_3_lop_va_doi_tuong_p.pptx