Tóm Tắt Bài Viết
Class trong C++ là gì?
Trong ngôn ngữ lập trình C++, khái niệm “Class” đề cập đến một cấu trúc được định nghĩa bởi người dùng hoặc các nhà phát triển, để mô tả một loại dữ liệu đơn giản hoặc một cấu trúc dữ liệu phức tạp. Được định nghĩa bằng từ khóa “class“, nó chứa các biến và/hoặc hàm.
Class trong C++, “Class” được hiểu là một tập hợp trừu tượng của các đối tượng có thuộc tính chung. Từ một góc độ khác, mỗi đối tượng là một trường hợp cụ thể của tập hợp trừu tượng đó.
Về cơ bản, một “Class” bao gồm các thành phần dữ liệu (còn được gọi là thuộc tính hoặc thuộc tính) và phương thức (hàm thành viên hoặc phương thức). Trong ngôn ngữ lập trình này, “Class” thực chất là một kiểu dữ liệu được người lập trình tự định nghĩa, và từ khóa “class” xác định điểm bắt đầu của việc triển khai một “Class”.
Về khái niệm đối tượng, trong lập trình hướng đối tượng, “object” được coi là một phiên bản trừu tượng của một thực thể trong thế giới thực. Thực thể này được mô hình hóa bởi con người, ghi lại các đặc điểm và hành vi của nó, từ đó tạo ra các “Attribute” (Thuộc tính) và “Method” (Phương thức) của đối tượng.
Ví dụ về class trong C++
Việc định nghĩa một lớp có thể hiểu là tạo ra một bản thiết kế (blueprint) cho một loại dữ liệu. Để diễn giải đơn giản hơn, quá trình này sẽ xác định các thành phần như tên của lớp, phạm vi của các đối tượng thuộc lớp đó, cũng như những hoạt động có thể thực hiện trên các đối tượng này.
Phần đầu tiên của việc định nghĩa lớp bắt đầu với từ khóa “class”, sau đó là tên của lớp và phần thân của lớp. Các phần này được bao quanh bởi dấu ngoặc nhọn {}. Ngay sau phần định nghĩa lớp, yêu cầu phải có dấu chấm phẩy “;” hoặc một danh sách các khai báo.
Một ví dụ về định nghĩa kiểu dữ liệu Box bằng cách dùng từ khóa class trong C++:
class Box
{
public: double chieudai;
// chieu dai box
double chieurong;
// chieu rong box
double chieucao;
// chieu cao box
};
Từ khóa public xác định rõ các thuộc tính truy cập của thành viên class theo sau nó. Với kiểu public, thành viên có thể được truy cập từ bên ngoài, miễn là nằm trong phạm vi (scope) của đối tượng class đó. Ngoài public, bạn cũng có thể để phạm vi truy cập là private và protected, thứ được đề cập ở phần bên dưới.
Làm sao để khai báo class trong C++
Việc định nghĩa một class không đồng nghĩa với việc đã có sẵn bộ nhớ được phân bổ cho các đối tượng thuộc class đó. Thực tế, mới chỉ có đặc tả cho đối tượng là đã được xác định. Chính vì vậy, muốn sử dụng các hàm truy cập trong class cũng như dữ liệu, bạn phải tiến hành khai báo đối tượng.
hocsinh obj_1;
hocsinh obj_2;
Cả hai đối tượng obj_1
và obj_2
đều có bản sao của các thành viên dữ liệu (Data Member) riêng biệt. Xét ví dụ trên, chúng ta có thể hình dung như sau:
Đối tượng obj_1 sẽ có các phương thức tên, tuổi, quê quán, trường, lớp, điểm toán, điểm văn… cũng như các hành vi đi, đứng, ngồi, học tập… khác biệt so với đối tượng obj_2.
Điều này đồng nghĩa với việc dữ liệu thành viên của 2 object là riêng biệt. Dữ liệu obj_1 không bị biến đổi khi obj_2 thay đổi và ngược lại. Các dữ liệu thành viên thuộc obj_1 cũng không có quyền truy cập, tác động đến dữ liệu tương ứng bên phía obj_2.
Hướng dẫn sử dụng class trong C++
Phạm vi truy cập các thành viên (access modifier)
Access modifier là phạm vi truy cập của các thuộc tính và phương thức, được khai báo ở phía bên dưới. Trong ngôn ngữ C++, có 3 loại phạm vi truy cập là public, private và protected.
Với các thuộc tính và phương thức khai báo public, mọi thứ khá đơn giản bởi bạn được quyền truy cập trực tiếp thông quan instance thuộc class đó. Bạn có thể truy cập chúng thông qua việc sử dụng toán tử truy cập thành viên trực tiếp là dấu chấm (.). Kiểu public thường được sử dụng khi không có ràng buộc điều kiện nào trước khi gán (tức là có thể tùy ý gán giá trị) cũng như nếu không cần xử lý trước khi trả về.
Khi đó, để có thể tiếp cận các thuộc tính private, cần phải thông qua các phương thức public một cách gián tiếp. Trong số các phương pháp, getter và setter là hai loại phổ biến nhất. Trong trường hợp bạn không muốn người khác có khả năng thay đổi giá trị một cách tự do, hoặc bạn muốn thực hiện một số xử lý cuối cùng trước khi trả về giá trị, việc sử dụng phạm vi private sẽ là lựa chọn có lý hơn.
Về phạm vi protected, các phương thức và thuộc tính chỉ có thể được truy cập thông qua các lớp kế thừa hoặc lớp đó chính nó. Đây là một phương pháp phức tạp, đòi hỏi sự tìm hiểu kỹ về C++.
Getter và setter
Như đã đề cập, thuộc tính riêng tư không thể truy cập trực tiếp từ bên ngoài mà cần sử dụng các hàm getter và setter. Hàm getter được dùng để truy xuất giá trị của thuộc tính, trong khi hàm setter được sử dụng để gán giá trị cho thuộc tính.
Việc sử dụng getter và setter có tính quan trọng cao trong việc kiểm soát những thuộc tính có yêu cầu về độ chính xác cao của giá trị. Chẳng hạn, nếu ta có thuộc tính “tuổi” để lưu trữ dữ liệu về độ tuổi của mỗi người, và giới hạn tuổi trong khoảng từ 0 đến 120, thì ta không thể cho phép chương trình lưu trữ giá trị âm hoặc lớn hơn 120 cho thuộc tính này.
Thuộc tính riêng tư được sử dụng với mục đích không cho phép người khác tự do gán giá trị, mà cần bạn xử lý dữ liệu trước khi trả về. Hàm getter và setter giúp thực hiện điều này.
Một điều cần chú ý là việc đặt tên cho getter và setter sao cho dễ phân biệt, tránh nhầm lẫn giữa hai chức năng.
Định nghĩa phương thức
Tính chất cơ bản của phương thức không khác biệt so với một hàm thông thường. Nó có thể được trang bị tham số hoặc không, có thể không trả về giá trị hoặc thực hiện việc ghi đè lên hàm. Khi truyền tham số vào phương thức, cách tiếp cận đầu tiên là đặt tên tham số trùng với thuộc tính của lớp bằng cách sử dụng toán tử :: cùng với con trỏ this. Cách tiếp cận thứ hai là đặt tên tham số khác với tên của thuộc tính (thường bằng cách thêm dấu gạch dưới _ vào đầu tên tham số, tương tự như tên của thuộc tính private).
Đối với việc định nghĩa thi hành phương thức, có hai phương pháp chính: Định nghĩa thi hành trong quá trình định nghĩa lớp và định nghĩa thi hành ở ngoài lớp.
Static member
Gọi là thành viên tĩnh, trong ngữ cảnh của lớp C++, static member cũng tương đối tương đồng với biến tĩnh trong hàm khi dịch sang tiếng Việt. Nếu so với hàm, biến tĩnh trong hàm không bị hủy sau khi khối lệnh thực thi và thoát ra ngoài, tương tự, với lớp, thành viên tĩnh là một thuộc tính chung cho tất cả các đối tượng thuộc lớp đó, ngay cả khi không có bất kỳ đối tượng nào tồn tại. Để hiểu rõ hơn, điều này có nghĩa là bạn có thể khai báo nhiều đối tượng với mỗi đối tượng sở hữu các thuộc tính riêng biệt, tuy nhiên, chỉ có duy nhất một thành viên tĩnh tồn tại trong toàn bộ chương trình.
Hàm thành viên trong lớp
Có 2 cách để xác định hàm thành viên trong C++ là xác định bên trong lớp và xác định bên ngoài lớp.
Để xác định hàm thành viên bên ngoài lớp, ta cần phải thông qua toán tử scope :: , đi kèm là tên lớp cùng tên phương thức. Mặc dù toàn bộ hàm thành viên được định nghĩa bên trong lớp bởi các inline mặc định, dẫu vậy với từ khóa inline, bạn hoàn toàn có thể thực hiện bất kỳ hàm không thuộc lớp nào. Inline chính là cách gọi rút gọn của inline function – hàm nội tuyến. Đây là những hàm thực tế, được sao chép mọi nơi suốt quá trình biên dịch như macro tiền xử lý, nhờ đó giúp tiết kiệm thời gian gọi hàm.
Kết luận
Trên hết, việc hiểu và áp dụng kiến thức về lập trình hướng đối tượng và lớp Class trong C++ là một bước quan trọng đối với những người mới học lập trình hoặc đang tìm hiểu về ngôn ngữ này. Class chính là cơ sở để bạn xây dựng các ứng dụng phức tạp và cấu trúc chương trình theo cách trực quan và cấu trúc hơn.
Trên đây là những kiến thức vô cùng đầy đủ và dễ hiểu về Class trong C++. Hy vọng những kiến thức này sẽ giúp bạn có thêm am hiểu về ngôn ngữ C++, và ứng dụng một cách thích hợp vào các công việc để đem lại hiệu quả nhất định.
>Xem thêm: