Lớp và đối tượng
Lớp: là một mô tả trừu tượng của nhóm các đối tượng cùng bản chất hay nói ngược lại là mỗi đối tượng là một thể hiện của thể cho những mô tả trừu tượng đó.
Ví dụ 1: đối tượng xe tải, xe con, xe cấp cứu, xe container,… có chung một số đặc tính như: 4 bánh, vô lăng, đèn, còi,… -> Lớp xe ô tô
Ví dụ 2: đối tượng chim sẻ, chim cu gáy, chim bồ câu,… có chung đặc tính như: biết bay, đẻ trứng,.. -> Lớp chim.
Khai báo lớp trong C++
1
2
3
4
5
6
7
8
9
| class <Ten lop> { private : <Khai bao cac thanh phan private > public : <Khai bao cac thanh phan public > protected : <Khai bao cac thanh phan protected > }; |
Các thành phần của lớp có thể là thuộc tính hoặc phương thức
Thuộc tính: các thuộc tính được khai báo giống như khai báo biến trong C.
Phương thức: được khai báo giống như khai báo hàm trong C. Có 2 cách định nghĩa phương thức là: định nghĩa trong lớp và ngoài lớp.
Quyền truy xuất: tất cả các thành phần có thuộc tính private chỉ được truy cập bởi các thành phần bên trong lớp đó. Các thành phần public có thể truy nhập từ bên ngoài lớp.
Con trỏ this: trỏ đến chính đối tượng đang gọi hàm.
Hàm tạo: bất kì một đối tượng nào cũng phải sử dụng một hàm tạo để khởi tạo các giá trị thành phần của đối tượng. Hàm tạo được khai báo giống như một phương thức với tên phương thức trùng với tên lớp và không có giá trị trả về. Có thể có nhiều hàm tạo trong cùng 1 lớp. Khi 1 lớp có nhiều hàm tạo, việc tạo các đối tượng phải kèm theo các tham số phù hợp với một trong các hàm tạo đã khai báo. Khi người dùng không khai báo bất kì một hàm tạo nào cho lớp thì trình biên dịch sẽ tự động sinh ra cho lớp một hàm tạo mặc định không có tham sô.
Hàm hủy: Hàm hủy được gọi khi đối tượng tương ứng bị xóa khỏi bộ nhớ. Hàm hủy được khai báo giống như một phương thức với tên bắt đầu bằng kí tự ~ và tiếp theo là tên của lớp. Hàm hủy không có tham số và không có giá trị trả về. Một lớp chỉ có duy nhất 1 hàm hủy.
Hàm tạo sao chép: là hàm tạo có tham số là một đối tượng của chính lớp đó. Trong 1 lớp luôn luôn có 1 hàm tạo sao chép. Nếu trong trường hợp người sử dụng không khai báo hàm thiết lập sao chép cho lớp thì trình biên dịch sẽ tự động sinh một hàm thiết lập sao chép mặc định cho lớp.
Thành phần static:
Hàm bạn và lớp bạn:
Thuộc tính: các thuộc tính được khai báo giống như khai báo biến trong C.
Phương thức: được khai báo giống như khai báo hàm trong C. Có 2 cách định nghĩa phương thức là: định nghĩa trong lớp và ngoài lớp.
Quyền truy xuất: tất cả các thành phần có thuộc tính private chỉ được truy cập bởi các thành phần bên trong lớp đó. Các thành phần public có thể truy nhập từ bên ngoài lớp.
Con trỏ this: trỏ đến chính đối tượng đang gọi hàm.
Hàm tạo: bất kì một đối tượng nào cũng phải sử dụng một hàm tạo để khởi tạo các giá trị thành phần của đối tượng. Hàm tạo được khai báo giống như một phương thức với tên phương thức trùng với tên lớp và không có giá trị trả về. Có thể có nhiều hàm tạo trong cùng 1 lớp. Khi 1 lớp có nhiều hàm tạo, việc tạo các đối tượng phải kèm theo các tham số phù hợp với một trong các hàm tạo đã khai báo. Khi người dùng không khai báo bất kì một hàm tạo nào cho lớp thì trình biên dịch sẽ tự động sinh ra cho lớp một hàm tạo mặc định không có tham sô.
Hàm hủy: Hàm hủy được gọi khi đối tượng tương ứng bị xóa khỏi bộ nhớ. Hàm hủy được khai báo giống như một phương thức với tên bắt đầu bằng kí tự ~ và tiếp theo là tên của lớp. Hàm hủy không có tham số và không có giá trị trả về. Một lớp chỉ có duy nhất 1 hàm hủy.
Hàm tạo sao chép: là hàm tạo có tham số là một đối tượng của chính lớp đó. Trong 1 lớp luôn luôn có 1 hàm tạo sao chép. Nếu trong trường hợp người sử dụng không khai báo hàm thiết lập sao chép cho lớp thì trình biên dịch sẽ tự động sinh một hàm thiết lập sao chép mặc định cho lớp.
Thành phần static:
Hàm bạn và lớp bạn:
Kế thừa C++
Một trong những đặc tính quan trọng nhất của OOP là kế thừa. Ưu điểm của đặc tính kế thừa: sử dụng lại các đoạn code đã có trong chương trình 1 cách hiệu quả.
Khi tạo 1 class, thay vì việc viết 1 class mới hoàn toàn, người lập trình viên có thể kế thừa một số thuộc tính và phương thức từ 1 class đã có trong project. Class đã có trước đấy gọi là lớp cơ sở (Base Class), class kế thừa từ Base Class gọi là lớp dẫn xuất (Derived Class).
Khai báo lớp dẫn xuất kế thừa từ lớp cơ sở
1
2
3
4
5
6
7
8
9
| class [Lớp dẫn xuất] : [Kiểu kế thừa] [Lớp cơ sở] { public : ... protected : ... private : ... }; |
Lớp dẫn xuất kế thừa tất cả các phương thức của lớp cơ sở ngoại trừ:
– Hàm tạo, hàm hủy và hàm tạo copy
– Chồng toán tử của lớp cơ sở
– Hàm bạn của lớp cơ sở
– Kế thừa Public:
+ Thành phần(thuộc tính + phương thức) public của lớp cơ sở trở thành thành phần public của lớp dẫn xuất.
+ Thành phần(thuộc tính + phương thức) protected của lớp cơ sở trở thành thành phần protected của lớp dẫn xuất.
+ Không thể truy cập trực tiếp thành phần(thuộc tính + phương thức) private của lớp cơ sở từ lớp dẫn xuất. Nhưng có thể truy cập thành phần private thông qua việc gọi thành phần public của lớp cơ sở.
– Kết thừa Protected:
+ Thành phần(thuộc tính + phương thức) protected và public của lớp cơ sở trở thành thành phần protected của lớp dẫn xuất.
– Kế thừa Private:
+ Thành phần(thuộc tính + phương thức) protected và public của lớp cơ sở trở thành thành phần private của lớp dẫn xuất.
Recommendation: Kế thừa kiểu private và protected ít khi được sử dụng, chủ yếu sử dụng kế thừa kiểu public
Ví dụ 1: Viết lớp điểm gồm 2 thuộc tính tọa độ x, y. Sau đó viết thêm lớp hình tròn kế thừa từ lớp điểm.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Chồng hàm và chồng toán tử C++Chồng hàm
C++ cho phép định nghĩa nhiều hàm có cùng tên với điều kiện:
Ví dụ 1: viết 2 hàm tìm giá trị lớn nhất của 2 số nguyên int, 2 số float.
Kết quả:
Chồng toán tử
Trong ngôn ngữ C, các toán tử +, -, *, /, %,…được sử dụng để tính toán với các kiểu dữ liệu nguyên thủy (int, float, long,..). Ngôn ngữ C++ cho phép định nghĩa toán tử +, -, *, /, % áp dụng cho các kiểu dữ liệu do người lập trình viên tự định nghĩa (mảng, ma trận, đối tượng,..) được gọi là chồng toán tử.
Các toán tử được phép và không được phép overload
Định nghĩa chồng toán tử
– Khai báo tên hàm toán tử: từ khóa operator và tên phép toán.
Ví dụ 2: operator+ (định nghĩa chồng phép +), operator- (định nghĩa chồng phép -)
– Các đối số của hàm toán tử
a. Với phép toán có 2 toán hạng, thì hàm toán tử cần có 2 đối số. Đối số thứ nhất tương ứng với toán hạng thứ nhất, đối số thứ hai tương ứng với toán hạng thứ hai. Do vậy, đối với phép toán không giao hoán (như phép -) thì thứ tự đối số là rất quan trọng
Ví dụ 3: Viết hàm toán tử cộng, trừ, nhân, chia phân số
b. Với phép toán 1 toán hạng, thì hàm toán tử cần 1 đối số. Ví dụ: hàm toán tử đổi dấu phân số.
Ví dụ 4:
– thân hàm toán tử: viết như thân hàm thông thường
Ví dụ 5: Viết hàm toán tử cộng 2 phân số
– Cách gọi hàm chồng toán tử
Cách 1:dùng như hàm thông thường
Cách 2: dùng như toán tử trong C/C++
| #include <iostream> using namespace std; //Base class class CPoint { private : double x, y; public : CPoint( double mx, double my); void disPoint(); }; CPoint::CPoint( double mx, double my) { x = mx; y = my; } void CPoint::disPoint() { cout << "(x, y) = " << "(" << x << "," << y << ")\n" ; } //Derived class class CCIRCLE : public CPoint { private : double r; public : CCIRCLE( double mx, double my, double mr); void disR(); }; CCIRCLE::CCIRCLE( double mx, double my, double mr) : CPoint(mx, my) { r = mr; } void CCIRCLE::disR() { cout << "r = " << r << "\n" ; } void main() { CCIRCLE oCircle(4.0, -5.0, 9.0); oCircle.disPoint(); oCircle.disR(); system ( "pause" ); }
|
Không có nhận xét nào:
Đăng nhận xét