C++ Lớp và đối tượng với ví dụ
⚡ Tóm tắt thông minh
Các lớp và đối tượng trong C++ Chúng tạo nên nền tảng của lập trình hướng đối tượng, trong đó một lớp định nghĩa một bản thiết kế về dữ liệu và các hàm thành viên, còn một đối tượng là một thể hiện cụ thể được tạo ra từ bản thiết kế đó.

Lớp học là gì?
A C++ lớp kết hợp dữ liệu và các phương thức để thao tác dữ liệu thành một. Các lớp cũng xác định hình thức của các đối tượng. Dữ liệu và phương thức chứa trong một lớp được gọi là thành viên của lớp. Lớp là kiểu dữ liệu do người dùng định nghĩa. Để truy cập các thành viên của lớp, chúng ta sử dụng một thể hiện của lớp. Bạn có thể xem lớp như một bản thiết kế chi tiết cho một đối tượng.
Một lớp có thể đóng vai trò là nguyên mẫu cho một ngôi nhà. Nó thể hiện vị trí và kích thước của cửa ra vào, cửa sổ, sàn nhà, v.v. Từ những mô tả này, ta có thể xây dựng một ngôi nhà. Ngôi nhà trở thành đối tượng. Có thể tạo ra nhiều ngôi nhà từ nguyên mẫu đó. Tương tự, cũng có thể tạo ra nhiều đối tượng từ một lớp.
Trong hình trên, chúng ta có một nguyên mẫu ngôi nhà đơn lẻ. Từ nguyên mẫu này, chúng tôi đã tạo ra hai ngôi nhà với những đặc điểm khác nhau.
Với ý tưởng về một lớp như một bản thiết kế, bước tiếp theo là xem cách khai báo một lớp trong mã lập trình.
Khai báo lớp
In C++Một lớp được định nghĩa bằng từ khóa `class`. Từ khóa này phải được theo sau bởi tên của lớp. Phần thân của lớp sau đó được thêm vào giữa dấu ngoặc nhọn `{ }`.
cú pháp
class class-name { // data // functions };
- tên lớp là tên được đặt cho lớp học.
- dữ liệu Đây là dữ liệu cho lớp, thường được khai báo dưới dạng biến.
- chức năng Đây là các hàm của lớp.
Việc khai báo tên và nội dung của lớp đương nhiên đặt ra câu hỏi ai có thể sử dụng từng thành viên.
Từ khóa riêng tư và công khai
Chắc hẳn bạn đã từng gặp hai từ khóa này. Chúng là những công cụ sửa đổi quyền truy cập.
Riêng:
Khi từ khóa riêng tư được sử dụng để định nghĩa một hàm hoặc lớp, nó sẽ trở thành riêng tư. Những thứ như vậy chỉ có thể truy cập được từ bên trong lớp.
Công cộng:
Mặt khác, từ khóa public làm cho dữ liệu/chức năng trở nên công khai. Chúng có thể được truy cập từ bên ngoài lớp học.
Sau khi một lớp tồn tại, các đối tượng có thể được tạo ra từ lớp đó, tương tự như cách các biến được tạo ra từ một kiểu dữ liệu.
Định nghĩa đối tượng
Các đối tượng được tạo ra từ các lớp. Các đối tượng lớp được khai báo tương tự như cách khai báo biến. Tên lớp phải đứng trước, theo sau là tên đối tượng. Đối tượng phải thuộc kiểu của lớp đó.
cú pháp
class-name object-name;
- tên lớp là tên của lớp mà từ đó một đối tượng sẽ được tạo ra.
- đối tượng tên Đây là tên sẽ được gán cho đối tượng mới.
Quá trình tạo một đối tượng từ một lớp được gọi là khởi tạo.
Sau khi một đối tượng được tạo, các thành viên công khai của nó có thể được truy cập trực tiếp thông qua một toán tử đơn giản.
Truy cập thành viên dữ liệu
Để truy cập các thành viên public của một lớp, chúng ta sử dụng toán tử dấu chấm (.) Đây là những thành viên được đánh dấu bằng công cụ sửa đổi truy cập công khai.
Ví dụ 1
#include <iostream> using namespace std; class Phone { public: double cost; int slots; }; int main() { Phone Y6; Phone Y7; Y6.cost = 100.0; Y6.slots = 2; Y7.cost = 200.0; Y7.slots = 2; cout << "Cost of Huawei Y6 : " << Y6.cost << endl; cout << "Cost of Huawei Y7 : " << Y7.cost << endl; cout << "Number of card slots for Huawei Y6 : " << Y6.slots << endl; cout << "Number of card slots for Huawei Y7 : " << Y7.slots << endl; return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Khai báo một lớp có tên là Phone.
- Sử dụng công cụ sửa đổi quyền truy cập công khai để đánh dấu các biến chúng ta sắp tạo là có thể truy cập công khai.
- Khai báo chi phí biến đổi của kiểu dữ liệu double.
- Khai báo một biến số nguyên có tên là slot.
- Kết thúc thân lớp.
- Gọi hàm main(). Logic chương trình nên được thêm vào trong phần thân của nó.
- Tạo một đối tượng có tên Y6 thuộc loại Phone. Điều này được gọi là khởi tạo.
- Tạo một đối tượng có tên Y7 thuộc loại Phone. Điều này được gọi là khởi tạo.
- Truy cập chi phí biến đổi/thành viên của lớp Phone bằng đối tượng Y6. Giá trị được đặt thành 100.0. Giá của Y6 hiện được đặt thành 100.0.
- Truy cập các vị trí biến/thành viên của lớp Phone bằng đối tượng Y6. Giá trị được đặt thành 2. Các khe cho Y6 hiện được đặt thành 2.
- Truy cập chi phí biến đổi/thành viên của lớp Phone bằng đối tượng Y7. Giá trị được đặt thành 200.0. Giá của Y7 hiện được đặt thành 200.0.
- Truy cập các vị trí biến/thành viên của lớp Phone bằng đối tượng Y7. Giá trị được đặt thành 2. Các khe cho Y7 hiện được đặt thành 2.
- In giá của Y6 trên bảng điều khiển cùng với văn bản khác.
- In giá của Y7 trên bảng điều khiển cùng với văn bản khác.
- In số lượng vị trí cho Y6 cùng với văn bản khác.
- In số lượng vị trí cho Y7 cùng với văn bản khác.
- Chương trình phải trả về một giá trị sau khi hoàn thành thành công.
- Kết thúc phần thân của hàm main().
Các thành viên công khai được phép truy cập mã nguồn từ bên ngoài, nhưng các thành viên riêng tư phải tuân theo các quy tắc truy cập nghiêm ngặt hơn nhiều.
Lớp học riêng là gì?
Các thành viên lớp được đánh dấu là riêng tư chỉ có thể được truy cập bởi các hàm được xác định trong lớp. Bất kỳ đối tượng hoặc hàm nào được xác định bên ngoài lớp đều không thể truy cập trực tiếp vào các thành viên đó. Một thành viên lớp riêng tư chỉ được truy cập bởi các chức năng thành viên và bạn bè.
Ví dụ 2
#include <iostream> using namespace std; class ClassA { public: void set_a(int val); int get_a(void); private: int a; }; int ClassA::get_a(void) { return a; } void ClassA::set_a(int val) { a = val; } int main() { ClassA a; a.set_a(20); cout << "Value of a is: " << a.get_a(); return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên ClassA.
- Sử dụng công cụ sửa đổi truy cập công khai để đánh dấu thành viên lớp sẽ được tạo là có thể truy cập công khai.
- Tạo hàm có tên set_a() nhận một giá trị nguyên val.
- Tạo một hàm có tên get_a().
- Sử dụng công cụ sửa đổi quyền truy cập riêng tư để đánh dấu thành viên lớp sẽ được tạo là có thể truy cập riêng tư.
- Khai báo một biến số nguyên có tên a.
- Kết thúc thân lớp.
- Sử dụng tên lớp và toán tử phân giải phạm vi để truy cập hàm get_a(). Chúng tôi muốn xác định chức năng của hàm khi được gọi.
- Hàm get_a() sẽ trả về giá trị của biến a khi được gọi.
- Kết thúc định nghĩa hàm get_a().
- Sử dụng tên lớp và toán tử phân giải phạm vi để truy cập hàm set_a(). Chúng tôi muốn xác định chức năng của hàm khi được gọi.
- Gán giá trị của biến val cho biến a.
- Kết thúc định nghĩa hàm set_a().
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một thể hiện của ClassA và đặt tên cho nó là a.
- Sử dụng thể hiện của lớp trên và hàm set_a() để gán giá trị 20 cho biến a.
- In một số văn bản cùng với giá trị của biến a trên bảng điều khiển. Giá trị của biến a có được bằng cách gọi hàm get_a().
- Chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Kết thúc phần thân của hàm main().
Các thành viên được bảo vệ nằm giữa các thành viên riêng tư và công khai, bổ sung thêm một khả năng quan trọng cho việc kế thừa.
Lớp được bảo vệ là gì?
Các thành viên của lớp được đánh dấu là được bảo vệ có lợi thế hơn những thành viên được đánh dấu là riêng tư. Chúng có thể được truy cập bởi các hàm trong lớp định nghĩa của chúng. Ngoài ra, chúng có thể được truy cập từ các lớp dẫn xuất.
Ví dụ 3
#include <iostream> using namespace std; class ParentClass { protected: int value; }; class ChildClass : public ParentClass { public: void setId(int x) { value = x; } void displayValue() { cout << "Value is: " << value << endl; } }; int main() { ChildClass c; c.setId(21); c.displayValue(); return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề iostream trong mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên ParentClass.
- Sử dụng công cụ sửa đổi truy cập được bảo vệ để đánh dấu thành viên lớp được tạo là được bảo vệ.
- Tạo một biến số nguyên có tên value.
- Kết thúc thân lớp.
- Tạo một lớp mới có tên ChildClass kế thừa ParentClass.
- Sử dụng công cụ sửa đổi quyền truy cập được bảo vệ để đánh dấu thành viên lớp sẽ được tạo là có thể truy cập được đối với các lớp con.
- Tạo hàm có tên setId() nhận một giá trị nguyên x.
- Gán giá trị của biến x cho giá trị biến.
- Kết thúc định nghĩa hàm setId().
- Tạo một hàm có tên displayValue().
- In giá trị của biến có tên value trên bảng điều khiển cùng với văn bản khác.
- Phần cuối của hàm displayValue().
- Kết thúc phần thân của lớp có tên ChildClass.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một thể hiện của ChildClass và đặt tên cho nó là c.
- Sử dụng thể hiện của lớp trên và hàm setId() để gán giá trị 21 cho biến x.
- Sử dụng thể hiện của lớp trên để gọi hàm có tên displayValue().
- Chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Kết thúc phần thân của hàm main().
Ngoài việc lưu trữ dữ liệu, một lớp còn nhóm các hàm hoạt động trên dữ liệu đó.
Chức năng thành viên lớp
Hàm giúp chúng ta thao tác với dữ liệu. Các hàm thành viên của lớp có thể được định nghĩa theo hai cách:
- Bên trong định nghĩa lớp
- Ngoài định nghĩa lớp
Nếu một hàm được định nghĩa bên ngoài định nghĩa lớp, chúng ta phải sử dụng toán tử phân giải phạm vi (::). Điều này phải được đi kèm với tên lớp và hàm.
Ví dụ 4
#include <iostream> #include <string> using namespace std; class Guru99 { public: string tutorial_name; int id; void printname(); void printid() { cout << "Tutorial id is: "<< id; } }; void Guru99::printname() { cout << "Tutorial name is: " << tutorial_name; } int main() { Guru99 guru99; guru99.tutorial_name = "C++"; guru99.id = 1001; guru99.printname(); cout << endl; guru99.printid(); return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Bao gồm tệp tiêu đề iostream trong chương trình của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm tệp tiêu đề chuỗi trong chương trình của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên Guru99.
- Sử dụng tùy chọn "quyền truy cập công khai" để đánh dấu các thành viên lớp mà chúng ta sắp tạo là có thể truy cập công khai.
- Tạo một biến chuỗi có tên là tutorial_name.
- Tạo một biến số nguyên có tên id.
- Tạo một hàm có tên printname(). Hàm này không được định nghĩa trong định nghĩa lớp.
- Hãy tạo một hàm có tên là printid(). Hàm này được định nghĩa trong phần định nghĩa của lớp. Phần thân của hàm đã được thêm vào trong phần định nghĩa của lớp.
- In giá trị của biến id cùng với văn bản khác trên bảng điều khiển. Lưu ý rằng điều này đã được thêm vào trong nội dung của hàm printid(). Nó sẽ chỉ được thực thi khi hàm printid() được gọi.
- Kết thúc phần thân hàm printid().
- Kết thúc phần nội dung chính của bài học Guru99.
- Bắt đầu định nghĩa hàm printname().
- In giá trị của biến tutorial_name trên bảng điều khiển cùng với văn bản khác. Lưu ý rằng điều này đã được thêm vào trong nội dung của hàm printname(). Nó sẽ chỉ được thực thi khi hàm printname() được gọi.
- Kết thúc định nghĩa hàm printname().
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một thể hiện của lớp Guru99 và đặt tên cho nó là guru99.
- Sử dụng ví dụ trên để gán giá trị của C++ vào biến tutorial_name.
- Sử dụng phiên bản guru99 để gán giá trị 1001 cho biến id.
- Sử dụng ví dụ guru99 để gọi hàm printname() .
- Gọi lệnh kết thúc (dòng cuối) để in một dòng trống mới trên bảng điều khiển.
- Sử dụng cá thể guru99 để gọi hàm printid().
- Chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Kết thúc phần thân của hàm main().
Hai hàm thành viên đặc biệt được chạy tự động khi một đối tượng được tạo và khi nó bị hủy.
Hàm tạo và hàm hủy
Trình xây dựng là gì?
Hàm khởi tạo là các hàm đặc biệt dùng để khởi tạo đối tượng. C++ trình biên dịch Khi tạo một đối tượng, ta gọi hàm tạo. Hàm tạo giúp gán giá trị cho các thành viên của lớp. Tất nhiên, điều này diễn ra sau khi các thành viên đó đã được cấp phát một lượng bộ nhớ nhất định.
Kẻ hủy diệt là gì?
Mặt khác, các hàm hủy giúp phá hủy các đối tượng của lớp.
Tên hàm tạo phải giống với tên lớp. Hàm tạo không có kiểu trả về.
Hàm tạo có thể được định nghĩa bên trong hoặc bên ngoài thân lớp. Nếu được định nghĩa bên ngoài thân lớp, nó phải được định nghĩa bằng tên lớp và toán tử phân giải phạm vi (::).
Ví dụ 5
#include <iostream> using namespace std; class ClassA { public: ClassA() { cout << "Class constructor called"<<endl; } ~ClassA() { cout << "Class destructor called"<<endl; } }; int main() { ClassA a; int p = 1; if (p) { ClassA b; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Code Giải thích:
- Đưa tệp tiêu đề iostream vào mã để sử dụng các chức năng của nó.
- Bao gồm không gian tên std trong mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Tạo một lớp có tên ClassA.
- Sử dụng công cụ sửa đổi quyền truy cập công khai để đánh dấu thành viên mà chúng tôi sắp tạo là có thể truy cập công khai.
- Tạo một hàm tạo cho lớp.
- Văn bản sẽ in trên bảng điều khiển khi hàm tạo được gọi. Cuối cùng là một C++ từ khóa, có nghĩa là dòng cuối cùng. Nó di chuyển con trỏ chuột đến dòng tiếp theo.
- Kết thúc phần thân của hàm tạo lớp.
- Tạo một hàm hủy cho lớp.
- Văn bản sẽ in trên bảng điều khiển khi hàm hủy được gọi. Cuối cùng là một C++ từ khóa, có nghĩa là dòng cuối cùng. Nó di chuyển con trỏ chuột đến dòng tiếp theo.
- Phần cuối của phần thân của hàm hủy diệt.
- Kết thúc thân lớp.
- Gọi hàm main(). Logic chương trình phải được thêm vào trong phần thân của hàm này.
- Tạo một đối tượng lớp và đặt tên cho nó là a. Hàm tạo sẽ được gọi.
- Tạo một biến số nguyên có tên p và gán cho nó giá trị 1.
- Tạo khối câu lệnh if sử dụng biến p.
- Tạo một đối tượng lớp và đặt tên cho nó b. Hàm hủy sẽ được gọi.
- Kết thúc phần thân của câu lệnh if.
- Phần cuối của hàm main().








