Lập Trình C++ B7: Lớp Và Lập Trình Hướng Đối Tượng
Lớp trong c++ và kỹ thuật lập trình hướng đối tượng trong c++
I. Tìm hiểu về kỹ thuật lập trình hướng đối tượng.
Để hiểu được bản chất của kỹ thuật lập trình hướng đối tượng, chúng ta cùng bắt đầu tìm hiểu các khái niệm sau đây.
1. Tư tưởng trừ tượng hóa dữ liệu.
Là tư tưởng xây dựng một chức năng để xử lý một nhiệm vụ nào đó, mà người sử dụng chỉ cần quan tấm đến
– Các tham số đầu vào là gì.
– Kết quả trả ra là gì.
KHÔNG CẦN QUAN TÂM ĐẾN CÁCH XỬ LÝ BÊN TRONG CỦA CHỨC NĂNG.
2. Tính đóng gói dữ liệu.
– Bất cứ một đối tượng nào cũng đều được phân tích thành 2 thành phần.
+ Các thuộc tính của đối tượng.
+ Các hành vi của đối tượng.
Ví dụ như sau:
Đối tượng là con người:
+ Thuộc tính: Tên, tuổi, giới tính, địa chỉ….
+ Hành Vi: Khai báo thông tin,
Đối tượng là một lớp học:
+ Thuộc tính: Tên lớp, số lượng, chỉ số xếp hạng…
+ Hành vi: Khai báo thông tin, kiểm tra số thành viên nam, nữ, đếm số lượng, tìm kiếm học sinh giỏi nhất….
Như vậy tính đóng gói dữ liệu là việc chúng ta gom 2 thành phần của một đối tượng lại thành một nhóm đại diện cho đối tượng đó.
Người ta gọi đó là các class.
=> Từ ví dụ trên ta có class người, class lớp học, class công ty, …..
3. Phương pháp lập trình cấu trúc :
Là phương pháp áp dụng nguyên lý chia để trị.
Toàn bộ các chức năng của chương trình sẽ được chia theo các nhóm chức năng.
Các nhóm chức năng có thể được coi là các module riêng biệt.
Trong mỗi module lại được phân thành nhiều các chương trình con.
Như vậy một chương trình là sự kết hợp của nhiều module, mỗi module là lại kết hợp của nhiều chương trình con.
+ Tạo được sự độc lập cao nhất có thể, như vậy khi lỗi chỗ nào ta sửa chỗ đó mà không quan tâm đến các vùng độc lập khác.
+ Dễ quản lý và phân vùng được rõ ràng. Sẽ có những đoạn code chất lượng được tái sử dụng.
Khi kết hợp cả 3 khái niệm trên lại, ta có được khái niệm: Kỹ Thuật Lập Trình Hướng Đối Tượng.
Nói cách khác, một chương trình được gọi là áp dụng kỹ thuật hướng đối tượng, nó phải thỏa mãn cả 3 yêu cầu trên.
II. Tìm hiểu về lớp trong c++
Như vậy từ định nghĩa về kỹ thuật lập trình hướng đối tượng như ở trên.
Chúng ta sẽ thấy, class chính là cơ sở chủ đạo để xây dựng nên phương pháp lập trình hướng đối tượng.
Vậy thì xây dựng, khái báo và mô hình hóa đối tượng bằng class như thế nào?.
Chúng ta sẽ cùng bắt đầu.
1. Thành phần của một lớp.
Như phân tích ở trên, lớp trong c++ gồm 2 thành phần.
+ Trường: (hay còn gọi là thuộc tính, biến thành viên) : Là các thuộc tính thể hiện đặc điểm tính chất cho đối tượng.
+ Phương thức: (hay còn được gọi là hành vi, hàm thành viên): Thể hiện các hành động của đối tượng.
Ví dụ:
Chúng ta mô hình hóa một vector hình học trong không gian 3d thành một lớp đối tượng trong c++
=> Trường: tọa độ x, y, z là các kiểu số thực.
=> Phương thức: Các phép tính cho vector như là phép cộng, phép trừ, phép tích vô hướng…
Như vậy khi bắt đầu làm một bài toán lập trình hướng đối tượng,
chúng ta phải có bước phân tích dữ liệu để xác định được hai thành phần cho lớp đối tượng.
2. Quyền truy nhập các thành phần.
Tư tưởng trừu tượng hóa dữ liệu, nó thể hiện tính toàn vẹn và bảo mật dữ liệu,
nghĩa là nó không cho người ta nhìn thấy hay truy nhập được vào những cái bên trong của nó,
Vì thế nó chỉ cho thấy các tham số đầu vào và kết quả trả ra.
Do đó quyền truy nhập được xây dựng để bảo mật cho các thành phần của đối tượng.
Có 3 quyền như sau.
Private: =>Bảo mật cao nhất, chỉ được truy cập bởi các hàm thành viên của lớp, và hàm bạn lớp bạn của lớp đó.
Protected : Quyền bảo mật có lựa chọn, cho phép thêm các lớp kế thừa có thể truy cập được.
Public : Quyền tự do.
Private và Protected thường được dùng cho các thuộc tính, để đảm bảo không cho phép tự do can thiệp thuộc tính 1 đối tượng.
Public: Thường được sử dụng cho các phương thức, vì các phương được gọi ở các hàm khác trong chương trình.
3. Cú pháp khai báo lớp trong c++.
class tên_class
{
Private: (tùy ý chọn, ko bắt buộc)
// khai báo các trường
Public: (tùy ý chọn không bắt buộc)
// Khai báo các phương thức.
};
Ví dụ:
a. Khởi tạo lớp dữ liệu DummyData
+ Có 3 trường int, float, con trỏ kiểu double
+ Có 3 phương thức: Hàm tạo, hàm hủy, hàm Show giá trị.
#include "stdafx.h" #include "conio.h" #include <iostream> class DummyData { private: int iVal_; float fVal_; double* pControl_; public: DummyData(); ~DummyData(); void ShowValue(); };
b. Định nghĩa lớp DummyData.
+ Hàm khởi tạo được sử dụng để thiết lập các giá trị ban đầu cho thuộc tính, cấp phát vùng nhớ cho con trỏ.
+ Phương thức hủy sẽ là nơi để giải phóng các vùng nhớ cấp phát, đưa các thuộc tính về giá trị mặc định ban đầu.
+ Hàm show dữ liệu, in các giá trị ra màn hình.
DummyData::DummyData() { iVal_ = 0; fVal_ = 0.0; pControl_ = new double(); } DummyData::~DummyData() { if (pControl_ != NULL) { delete pControl_; pControl_ = NULL; } } void DummyData::ShowValue() { std::cout << "iVal = " << iVal_; std::cout << std::endl; std::cout << "iVal = " << iVal_; }
c. Sau khi khởi tạo và định nghĩa xong lớp. Sử dụng lớp thế nào?
Khai báo một biến đối tượng kiểu DummyData.
Gọi hàm ShowValue.
void main() { DummyData d1; d1.ShowValue(); }
Như vậy lúc này chúng ta thấy.
+ DummyData như một kiểu dữ liệu thông thường, nhưng nó trừu tường hơn, vì trong nó có cả phương thức và thuộc tính.
+ Hàm ShowValue cho chúng ta được kết quả trả ra, không cần đầu vào, và cũng chẳng biết bên trong nó thực hiện gì.
+ Quyền truy nhập private cho các thuộc tính sẽ bảo mật chúng.
=> Bạn sẽ không thể gán: d1.iVal_ = 5 trong hàm main.
+ Muốn lấy được giá trị của các thuộc tính hoặc thay đổi chúng, phải sử dụng cơ chế DataHinding.
=> Viết hai hàm dưới đây và đương nhiên sử dụng quyền public cho chúng.
+ kiểu dữ liệu GetValue() const {return m_value;}
+ void SetValue(const kiểu dữ liệu value) {m_value = value;}
Như vậy trong hàm main, để gán giá trị cho biến, bạn có thể gọi.
d1.SetValue(5.0);
III. THỰC HÀNH
Lý thuyết cơ bản là như vậy, và bây giờ chúng ta sẽ thực hành một ví dụ để dễ hiểu hơn.
Bài toán thực hành. Xây dựng một lớp quản lý thông tin cá nhân của một nhân viên trong công ty.
=> Nhập vào một danh sách các nhân viên công ty với các thông số cần thiết như:
Họ và Tên, tuổi, giới tính, quê quán, mức lương.
=> Thống kê có bao nhiêu thành viên là nữ, bao nhiêu thành viên là nam.
=> Xuất ra màn hình toàn bộ thông tin.
=> In ra người có mức lương cao nhất.
End