Sự khác biệt giữa Class và Struct

Trước khi chúng ta hiểu sự khác biệt giữa Class và Struct, chúng ta nên biết một vài khái niệm cơ bản liên quan đến chúng. Không có sự hiểu biết về các khái niệm, rất khó để hiểu được sự khác biệt giữa hai khái niệm.

Lớp học và đối tượng là gì:

Đây là hai khái niệm quan trọng liên quan đến Lập trình hướng đối tượng và chúng là cơ sở để đóng khung các chức năng và dữ liệu truyền sang các chức năng khác. Để hiểu rõ hơn, chúng ta có thể tương quan nó với một ví dụ thực tế. Một Class có thể được coi là một cửa hàng và một Object có thể là bất kỳ cửa hàng riêng lẻ nào, cụ thể như tạp hóa, văn phòng phẩm, trái cây, v.v ... Tất cả các đối tượng đều có chung các thuộc tính của lớp chính - cửa hàng - và lần lượt, các đối tượng có thể có các thuộc tính độc quyền của riêng chúng như thiết kế cụ thể, ánh sáng, v.v ... Thông qua các đối tượng, chúng ta thực sự có thể sử dụng lớp; chúng tạo thành các thể hiện của một lớp.

Cú pháp của một lớp

Cửa hàng lớp học

những thứ chuỗi công khai;

thiết kế chuỗi công cộng;

Cú pháp của một đối tượng

Cửa hàng tạp hóa = Cửa hàng mới ();

Cửa hàng Văn phòng phẩm = Cửa hàng mới ();

Cấu trúc là gì?

Một Struct chỉ bao gồm dữ liệu và do đó rất hữu ích trong việc đóng khung các yêu cầu dữ liệu riêng lẻ thông qua các đối tượng Struct. Không giống như một lớp, nó thiếu chức năng. Đây là cú pháp của nó:

struct g tạp chí_entrance

char entry_name [50];

int entry_size;

tạp hóa_entrance;

Tất cả các cửa hàng có thể sử dụng 'lối vào' của Struct với tên và kích thước riêng.

Kế thừa là gì?

Nó tương tự như cách một đứa con trai thừa hưởng tài sản của cha mình và đến lượt nó, con trai cũng có thể thêm một số tài sản khác của riêng mình. Lớp có thể là lớp cơ sở hoặc lớp dẫn xuất, trong đó lớp trước có thể được lấy làm cơ sở để tạo thành lớp sau. Lớp dẫn xuất thêm một vài thuộc tính khác cho chính nó ngoài những gì nó nhận được từ lớp cơ sở. Khi chúng tôi xem xét ví dụ trên, cửa hàng tạp hóa vẫn có thể được dẫn đến một cửa hàng tạp hóa cụ thể, chẳng hạn như cửa hàng tạp hóa XYZ.

Bây giờ chúng ta đã quen với các khái niệm cơ bản, chúng ta có thể đi vào sự khác biệt thực tế giữa Class và Struct.

Làm thế nào để họ khác nhau?

  • Tái sử dụng: Khi các lớp tạo thành khung cơ bản, chúng có thể được sử dụng lại; Tuy nhiên, các cấu trúc là các thành phần riêng lẻ với các thuộc tính cụ thể, vì vậy chúng không thể được sử dụng lại. Ví dụ: Lớp cửa hàng tạp hóa có thể được sử dụng cho bất kỳ loại cửa hàng tạp hóa nào, nhưng Cấu trúc tạp hóa cấu trúc chỉ dành riêng cho điều đó và không có ý định sử dụng lại nó trong các lớp khác.
  • Hiển thị: Tất cả các chức năng trong một Class đều có sẵn công khai cho các Đối tượng của nó. Ví dụ: chúng tôi có một chức năng có tên là 'những thứ' trong 'cửa hàng' của Lớp. Chức năng 'mọi thứ' hiển thị cho tất cả các Đối tượng của nó, chẳng hạn như 'cửa hàng tạp hóa, store cửa hàng văn phòng phẩm', v.v. Khả năng hiển thị như vậy là không thể đối với Structs vì dữ liệu của struct bị giới hạn ở chính nó và không thể nhìn thấy đối với các Structs khác. Để làm cho mọi thứ rõ ràng, chúng tôi có thể nói rằng dữ liệu của 'cửa hàng tạp hóa' không được hiển thị công khai cho tất cả các cửa hàng khác.
  • Vượt qua tham chiếu & Vượt qua giá trị: Pass by Reference chỉ gửi vị trí bộ nhớ chứ không phải dữ liệu thực tế cho các chức năng. Điều này có nghĩa là bất cứ khi nào giá trị thay đổi, sự thay đổi được phản ánh trong các hàm tương ứng. Lần lượt đi qua giá trị, chỉ là gửi giá trị cho hàm. Trong trường hợp này, thay đổi giá trị sau khi được gửi sẽ không được phản ánh trong hàm. Lớp sử dụng pass theo tham chiếu và Struct sử dụng giá trị pass.
  • Di sản: Các lớp có thể được kế thừa để tạo thành các lớp con, nhưng Structs không thể sử dụng sự kế thừa. Ví dụ: Cửa hàng Class cung cấp các chức năng của nó cho 'cửa hàng tạp hóa' của lớp con. Nhưng cấu trúc 'g tạp hóa' không thể kế thừa bất kỳ chức năng nào. Chúng ta có thể nói rằng không có khái niệm như cấu trúc con ở đây.
  • Khả năng hiển thị mặc định: Tất cả các thành viên của Class được giữ làm thực thể riêng tư theo mặc định, trong khi các thành viên của Struct được giữ làm thực thể công khai theo mặc định.
  • Kích thước của Class và Struct trống: Lớp sử dụng kích thước 1 Byte ngay cả khi nó trống, trong khi Struct không bao giờ sử dụng bất kỳ bộ nhớ nào khi trống. Điều này có nghĩa là chúng ta có thể nói rằng kích thước của một cấu trúc trống bằng 0 byte.
  • Thu gom rác thải: Có thể thu gom rác với các Lớp, vì chúng sử dụng thông qua tham chiếu. Do đó, việc dọn dẹp tại một địa điểm lưu trữ dữ liệu sẽ dễ dàng hơn. Mặt khác, không thể thu thập rác với Struct vì nó sử dụng truyền theo giá trị và dữ liệu được phân tán tại các vị trí khác nhau.
  • Quản lý bộ nhớ: Vì Class cho phép thu gom rác, việc quản lý bộ nhớ cũng hiệu quả; tuy nhiên, nó không hiệu quả với Structs.
  • Constructor: Một constructor thường khởi tạo lớp với các giá trị được chỉ định nhất định. Chúng ta có thể xem nó giống như một cái gì đó đã được khởi tạo với các giá trị. Nếu một lớp mới phải được tạo, hàm tạo được gọi để phân bổ bộ nhớ cho thể hiện đó. Chúng ta thậm chí có thể truyền các giá trị dưới dạng đối số trong khi gọi hàm tạo. Hãy để chúng tôi đến cuộc thảo luận thực tế của chúng tôi bây giờ. Các lớp cho phép các hàm tạo của tất cả các loại, chẳng hạn như có hoặc không có đối số, trong khi các cấu trúc chỉ cho phép các hàm tạo có đối số, tức là các hàm tạo được tham số hóa.
  • Kẻ hủy diệt: Một hàm hủy được gọi bất cứ khi nào chúng ta cần xóa một thể hiện của một lớp. Ngược lại, hàm hủy sẽ xóa cá thể đó và giải phóng bộ nhớ. Một Class có thể sử dụng một hàm hủy, trong khi Struct không thể.
  • Khởi tạo biến thành viên: Trong Classes, chúng ta có thể khởi tạo trực tiếp các biến thành viên; việc khởi tạo như vậy là không thể với Structs.
  • Tạo đối tượng: Cú pháp chung để tạo đối tượng trong các lớp là:

Demo obj = Demo mới ();

Điều này có nghĩa là chúng ta phải sử dụng từ khóa 'mới' trong khi tạo các đối tượng của một lớp. Điều này là không bắt buộc khi tạo các đối tượng của Structs. Chỉ cần nhìn vào cú pháp của họ:

Demo obj;

Nó hoạt động hoàn hảo ngay cả khi không có từ khóa 'mới'.

Khi nào nên sử dụng Class và khi nào sử dụng Struct?

Vì các Class linh hoạt hơn trong việc bàn giao dữ liệu và các chức năng với nhau, chúng ta có thể thực hiện nó khi các đối tượng được sử dụng rất phức tạp và lớn. Trong ví dụ của chúng tôi, một Mall có thể sử dụng lớp 'store' để thể hiện hệ thống theo cách tốt hơn. Tuy nhiên, các cấu trúc được giới hạn trong các đối tượng nhỏ hơn, vì chúng tương đối kém hiệu quả hơn các Class. Do đó, nếu bạn thiết kế một cửa hàng của riêng mình, Structs là lựa chọn tốt hơn.

Làm thế nào để chuyển đổi một cấu trúc thành một lớp và Vice Versa?

Bạn có thể đã nghe các thuật ngữ 'quyền anh' và 'unboxing' để chuyển đổi một cấu trúc thành một lớp và ngược lại. Mặc dù đây là các quy trình hiệu quả để giúp chúng tôi chuyển đổi, nhưng chúng nên được xử lý một cách thận trọng. Vì điều này ảnh hưởng trực tiếp đến các vị trí bộ nhớ, có tác động rất lớn đến hiệu suất của hệ thống của chúng tôi. Hơn nữa, nó ảnh hưởng đến các quy trình thu gom rác và dẫn đến hệ thống không hiệu quả. Do đó, chỉ sử dụng các chuyển đổi này khi cần thiết.

Chúng ta hãy xem xét sự khác biệt nêu trên ở dạng bảng.

S.Không Các khái niệm Sự khác biệt
Lớp học Cấu trúc
1 Tái sử dụng Hoàn toàn có thể sử dụng lại Không thể tái sử dụng
2 Hiển thị Tất cả các chức năng của một Class được hiển thị cho các đối tượng của nó Dữ liệu của một đối tượng của một cấu trúc không hiển thị cho các đối tượng khác của cùng một cấu trúc
3 Vượt qua tham chiếu & vượt qua giá trị Sử dụng thông qua tham khảo Sử dụng theo giá trị
4 Di sản Các chức năng của một lớp có thể được kế thừa bởi các lớp con của nó; cho phép thừa kế Không bao giờ cho phép thừa kế
5 Hiển thị mặc định Tất cả các thành viên của Class đều ở chế độ riêng tư theo mặc định Tất cả các thành viên của Struct đều được công khai theo mặc định
6 Kích thước khi trống Kích thước của một lớp trống là 1 Byte Kích thước của Struct trống là 0 Byte
7 Thu gom rác thải Vì nó sử dụng pass bằng tham chiếu, nên có thể thu gom rác Vì nó sử dụng pass by value, không thể thu gom rác
số 8 Quản lý bộ nhớ Sự dễ dàng của quy trình thu gom rác giúp quản lý bộ nhớ hiệu quả Việc thiếu bộ sưu tập rác dẫn đến việc quản lý bộ nhớ kém
9 Người xây dựng Cho phép các nhà xây dựng của tất cả các loại, chẳng hạn như có hoặc không có tham số Chỉ cho phép các nhà xây dựng tham số
10 Phá hủy Co thể dùng nó Không thể sử dụng nó
11 Thành viên khởi tạo biến Cho phép khởi tạo trực tiếp các biến thành viên Không cho phép khởi tạo từ trực tiếp của các biến thành viên
12 Tạo đối tượng Phải sử dụng từ khóa 'mới' trong quá trình tạo đối tượng Tùy chọn sử dụng từ khóa 'mới' trong quá trình tạo đối tượng
13 Khi nào sử dụng? Tốt hơn cho các đối tượng lớn hơn và phức tạp, nơi cần có sự kế thừa Tốt hơn cho các đối tượng nhỏ hơn và đơn giản hơn, nơi kế thừa ít quan trọng hơn.

Chúng tôi gần như đã đề cập đến tất cả sự khác biệt giữa Class và Struct và nếu bạn cảm thấy thiếu thứ gì đó, vui lòng cho chúng tôi biết. Chúng ta hãy cùng nhau học hỏi và tận dụng tối đa kiến ​​thức đó!