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ế đó.

  • 🔷 Sơ đồ lớp học: A C++ Lớp này gộp các thành viên dữ liệu và các hàm thành viên vào một kiểu dữ liệu do người dùng định nghĩa.
  • 🔑 Các yếu tố điều chỉnh quyền truy cập: Các từ khóa private, public và protected kiểm soát phạm vi truy cập vào các thành viên của lớp.
  • 🧱 Khởi tạo đối tượng: Một đối tượng được tạo ra từ một lớp bằng cú pháp tên lớp-tên đối tượng.
  • 👉 Quyền truy cập dành cho thành viên: Toán tử dấu chấm truy cập các thành viên công khai, trong khi các hàm thành viên thao tác với dữ liệu được lưu trữ.
  • ⚙️ Người xây dựng: Hàm khởi tạo tự động khởi tạo các đối tượng, và hàm hủy giải phóng chúng khi chúng nằm ngoài phạm vi.
  • 🤖 Hỗ trợ AI: GitHub Copilot và các trợ lý AI tương tự tạo ra các định nghĩa lớp và hàm tạo từ một đoạn bình luận ngắn.

C++ Lớp và đối tượng

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.

C++ lớp như một bản thiết kế cho các đối tượng

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:

C++ Ví dụ 1 về truy cập các thành viên dữ liệu công khai

Đây là ảnh chụp màn hình của mã:

C++ Ví dụ mã truy cập các thành viên dữ liệu công khai

Code Giải thích:

  1. 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ó.
  2. 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ó.
  3. Khai báo một lớp có tên là Phone.
  4. 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.
  5. Khai báo chi phí biến đổi của kiểu dữ liệu double.
  6. Khai báo một biến số nguyên có tên là slot.
  7. Kết thúc thân lớp.
  8. 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ó.
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. 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.
  14. 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.
  15. In giá của Y6 trên bảng điều khiển cùng với văn bản khác.
  16. In giá của Y7 trên bảng điều khiển cùng với văn bản khác.
  17. In số lượng vị trí cho Y6 cùng với văn bản khác.
  18. In số lượng vị trí cho Y7 cùng với văn bản khác.
  19. Chương trình phải trả về một giá trị sau khi hoàn thành thành công.
  20. 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:

C++ Ví dụ đầu ra của thành viên lớp riêng tư 2

Đây là ảnh chụp màn hình của mã:

C++ Ví dụ mã cho thành viên lớp riêng tư 2

Code Giải thích:

  1. 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ó.
  2. 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ó.
  3. Tạo một lớp có tên ClassA.
  4. 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.
  5. Tạo hàm có tên set_a() nhận một giá trị nguyên val.
  6. Tạo một hàm có tên get_a().
  7. 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ư.
  8. Khai báo một biến số nguyên có tên a.
  9. Kết thúc thân lớp.
  10. 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.
  11. Hàm get_a() sẽ trả về giá trị của biến a khi được gọi.
  12. Kết thúc định nghĩa hàm get_a().
  13. 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.
  14. Gán giá trị của biến val cho biến a.
  15. Kết thúc định nghĩa hàm set_a().
  16. 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.
  17. Tạo một thể hiện của ClassA và đặt tên cho nó là a.
  18. 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.
  19. 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().
  20. Chương trình phải trả về giá trị sau khi hoàn thành thành công.
  21. 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:

C++ Ví dụ đầu ra của thành viên lớp được bảo vệ 3

Đây là ảnh chụp màn hình của mã:

C++ Ví dụ 3 về kế thừa lớp được bảo vệ

Code Giải thích:

  1. 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ó.
  2. 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ó.
  3. Tạo một lớp có tên ParentClass.
  4. 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ệ.
  5. Tạo một biến số nguyên có tên value.
  6. Kết thúc thân lớp.
  7. Tạo một lớp mới có tên ChildClass kế thừa ParentClass.
  8. 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.
  9. Tạo hàm có tên setId() nhận một giá trị nguyên x.
  10. Gán giá trị của biến x cho giá trị biến.
  11. Kết thúc định nghĩa hàm setId().
  12. Tạo một hàm có tên displayValue().
  13. 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.
  14. Phần cuối của hàm displayValue().
  15. Kết thúc phần thân của lớp có tên ChildClass.
  16. 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.
  17. Tạo một thể hiện của ChildClass và đặt tên cho nó là c.
  18. 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.
  19. Sử dụng thể hiện của lớp trên để gọi hàm có tên displayValue().
  20. Chương trình phải trả về giá trị sau khi hoàn thành thành công.
  21. 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:

C++ Hàm thành viên lớp Ví dụ 4 đầu ra

Đây là ảnh chụp màn hình của mã:

C++ Hàm thành viên lớp Ví dụ 4 mã

Code Giải thích:

  1. 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ó.
  2. 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ó.
  3. 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ó.
  4. Tạo một lớp có tên Guru99.
  5. 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.
  6. Tạo một biến chuỗi có tên là tutorial_name.
  7. Tạo một biến số nguyên có tên id.
  8. 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.
  9. 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.
  10. 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.
  11. Kết thúc phần thân hàm printid().
  12. Kết thúc phần nội dung chính của bài học Guru99.
  13. Bắt đầu định nghĩa hàm printname().
  14. 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.
  15. Kết thúc định nghĩa hàm printname().
  16. 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.
  17. Tạo một thể hiện của lớp Guru99 và đặt tên cho nó là guru99.
  18. Sử dụng ví dụ trên để gán giá trị của C++ vào biến tutorial_name.
  19. Sử dụng phiên bản guru99 để gán giá trị 1001 cho biến id.
  20. Sử dụng ví dụ guru99 để gọi hàm printname() .
  21. 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.
  22. Sử dụng cá thể guru99 để gọi hàm printid().
  23. Chương trình phải trả về giá trị sau khi hoàn thành thành công.
  24. 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:

C++ Ví dụ 5 về hàm tạo và hàm hủy. Kết quả đầu ra.

Đây là ảnh chụp màn hình của mã:

C++ Ví dụ mã 5 về hàm tạo và hàm hủy

Code Giải thích:

  1. Đưa tệp tiêu đề iostream vào mã để sử dụng các chức năng của nó.
  2. 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ó.
  3. Tạo một lớp có tên ClassA.
  4. 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.
  5. Tạo một hàm tạo cho lớp.
  6. 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.
  7. Kết thúc phần thân của hàm tạo lớp.
  8. Tạo một hàm hủy cho lớp.
  9. 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.
  10. Phần cuối của phần thân của hàm hủy diệt.
  11. Kết thúc thân lớp.
  12. 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.
  13. 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.
  14. Tạo một biến số nguyên có tên p và gán cho nó giá trị 1.
  15. Tạo khối câu lệnh if sử dụng biến p.
  16. Tạo một đối tượng lớp và đặt tên cho nó b. Hàm hủy sẽ được gọi.
  17. Kết thúc phần thân của câu lệnh if.
  18. Phần cuối của hàm main().

Câu Hỏi Thường Gặp

Lớp là một bản thiết kế do người dùng định nghĩa, nhóm các thành viên dữ liệu và các hàm thành viên thành một kiểu duy nhất. Đối tượng là một thể hiện cụ thể được xây dựng từ lớp đó, chứa bản sao dữ liệu riêng của nó được mô tả bởi bản thiết kế.

Sự khác biệt chính nằm ở quyền truy cập mặc định: các thành viên của một lớp mặc định là private, trong khi các thành viên của một lớp khác thì không. cấu trúc Theo mặc định, chúng là public. Cả hai đều hỗ trợ kế thừa, hàm tạo và đóng gói. C++.

C++ Hỗ trợ ba loại hàm tạo phổ biến: hàm tạo mặc định không có đối số, hàm tạo có tham số chấp nhận các giá trị để khởi tạo các thành viên và hàm tạo sao chép tạo một đối tượng mới từ một đối tượng hiện có cùng lớp.

Hàm bạn (friend function) là một hàm không phải là thành viên nhưng được cấp quyền truy cập vào các thành viên private và protected của một lớp. Nó được khai báo bên trong lớp bằng từ khóa `friend`, nhưng được định nghĩa bên ngoài lớp giống như một hàm thông thường.

Con trỏ `this` là một con trỏ ngầm định có sẵn bên trong mọi hàm thành viên không tĩnh. Nó trỏ đến đối tượng đã gọi hàm, cho phép mã tham chiếu đến các thành viên của chính đối tượng đó và giải quyết xung đột tên giữa các tham số và thành viên dữ liệu.

Nguyên tắc đóng gói (encapsulation) gom dữ liệu và các hàm thao tác trên dữ liệu đó vào một lớp duy nhất, sau đó che giấu các chi tiết bên trong bằng cách sử dụng các thành viên riêng tư (private members). Các hàm thành viên công khai (public member functions) cung cấp một giao diện được kiểm soát, bảo vệ dữ liệu khỏi sự truy cập ngẫu nhiên hoặc trái phép.

Đúng vậy. Trợ lý lập trình AI có thể chuyển một lời nhắc ngắn hoặc bình luận thành các định nghĩa lớp hoạt động, bao gồm các thành viên dữ liệu, bộ chỉ định truy cập, hàm tạo và hàm thành viên. Luôn luôn xem lại các cấp độ truy cập và logic khởi tạo được tạo ra trước khi biên dịch mã.

Vâng. Trợ lý GitHub Nó tự động gợi ý khai báo lớp, hàm tạo, phương thức getter và setter khi bạn gõ. Nó xử lý nhanh chóng các đoạn mã lặp đi lặp lại, tuy nhiên bạn vẫn nên kiểm tra quyền truy cập thành viên, logic hàm tạo và cách sử dụng đối tượng trước khi biên dịch.

Tóm tắt bài viết này với: