Khai báo một classclass { [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
Trang 1Bài 3: Lớp và đối tượng
Trang 2Lớ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ử
Trang 3So sánh giữa class và struct
• Struct là 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
Trang 4Nội dung
hàm
• Khai báo static
• Tìm hiểu con trỏ this
Trang 5Khai báo một class
class <tên_lớp>
{
[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
};
Trang 6Khai 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
Trang 7Khai báo một class
Student aSophomore;
aSophomore.idNum = 7645;
cout<<aSophomore.idNum;
Error! By default, all members of a
class are private
Trang 8Khai báo một class
Access modifier
Trang 9Đó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
<kiểu dữ liệu > <tên_thành_phầ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
Trang 10Đó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
<kiểu trả về > tênlớp::<tên_hàm>([đối sô])
Trang 11Đóng gói các thành phần của một lớp
Trang 13Ví 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
Trang 14Ví 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
Trang 16Khai báo đối tượng
Trang 17Truy xuất đối tượng
Trang 18Hà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.
Trang 20Dùng hàm tạo để khởi gán các giá trị
thuộc tính cho đối tượng
Trang 21Dù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();
Trang 22Hàm khởi tạo
Như vậy hàm khởi tạo:
Không có giá trị trả về
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
Trang 23Hàm khởi tạo sao chép (copy constructor)
• 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.
Trang 24Hàm khởi tạo sao chép (copy constructor)
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 }
PS (const PS &p) {
this->t = p.t ; this->m = p.m ; }
Trang 25Hà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.
Trang 26Hà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];
}
Trang 27this->n=0;
delete this->a;
}
Trang 28nhớ
Trang 29Khai 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
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
Trang 30Thuộc tính static
Trang 31Thuộ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.
Trang 32• Các hàm static không thể truy cập được các biến
không phải static
Trang 33Các hàm static (tiếp)
Trang 36Con 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
Trang 37Hàm bạn (friend function)
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)
Trang 38Hà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).
Trang 39Hàm bạn (friend function)
trong định nghĩa lớp
Trang 40Hàm bạn (friend function)
▫ 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.
Trang 41u.a = this->a + u2.a ;
u.b = this->b + u2.b ;
Trang 42u.a = u1.a + u2.a ;
u.b = u1.b + u2.b ;
Trang 43Hàm bạn (friend function)
Khi đó có thể truy cập được tất cả các thuộc tính của các lớp
hưởng của từ khoá truy xuất
43/20