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.
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 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:
bai_giang_lap_trinh_huong_doi_tuong_bai_3_lop_va_doi_tuong_p.pptx

