C++ Lớp và đối tượng với ví dụ
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 là nguyên mẫu cho một ngôi nhà. Nó cho thấy 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, chúng 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. Ngoài ra, 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.
Khai báo lớp
Trong C+, một lớp được định nghĩa bằng từ khóa class. Điều này nên được theo sau bởi tên lớp. Sau đó, phần thân lớp được thêm vào giữa các dấu ngoặc nhọn { }.
cú pháp
class class-name { // data // functions };
- Tên lớp là tên để gán cho lớp.
- Dữ liệu là dữ liệu của lớp, thường được khai báo dưới dạng biến.
- Các hàm là các hàm lớp.
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.
Định nghĩa đối tượng
Các đối tượng được tạo từ các lớp. Các đối tượng lớp được khai báo theo cách tương tự như các biến được khai báo. Tên lớp phải bắt đầu, theo sau là tên đối tượng. Đối tượng của loại 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.
- Tên đối tượng là tên đượ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.
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ã:
Giải thích mã:
- 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().
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è.
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ụ 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ã:
Giải thích mã:
- 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().
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ã:
Giải thích mã:
- 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().
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ụ 2
#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ã:
Giải thích mã:
- 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 công cụ sửa đổi 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.
- Tạo một hàm có tên là print(). Hàm này được định nghĩa trong định nghĩa lớp. Phần thân của nó đã được thêm vào trong định nghĩ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 thân của lớp 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 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().
Hàm tạo và hàm hủy
Nhà xây dựng là gì?
Cấu trúc là các hàm đặc biệt khởi tạo các đối tượng. Các C++ trình biên dịch gọi một hàm tạo khi tạo một đối tượng. Các 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, đây là sau khi chúng đã được phân bổ một số dung lượng bộ 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ụ 3
#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ã:
Giải thích mã:
- Đư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().
Tổng kết
- C++ là hướng đối tượng.
- Các lớp tạo nên những đặc điểm chính của C++ làm cho nó hướng đối tượng.
- 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.
- Một lớp là một bản thiết kế chi tiết cho một đối tượng.
- Các lớp xác định hình thức của một đố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.
- Để truy cập các thành viên của lớp, bạn nên sử dụng một thể hiện của lớp.
- Để tạo một lớp, chúng ta sử dụng từ khóa class.
- Các hàm thành viên của lớp có thể được định nghĩa bên trong hoặc bên ngoài một lớp.