Lớp Versus Struct


12

Trong C ++ và các ngôn ngữ bị ảnh hưởng khác, có một cấu trúc gọi là Cấu trúc ( struct) và một ngôn ngữ khác gọi là class. Cả hai đều có khả năng giữ chức năng và các biến. Một số khác biệt là:

  1. Lớp được cấp bộ nhớ trong heap và structđược cấp bộ nhớ trong ngăn xếp (nhận xét: điều này sai với C ++, nhưng có thể đúng trong cái mà OP gọi là "ngôn ngữ bị ảnh hưởng")
  2. Biến lớp là riêng tư theo mặc định và trong structđó chúng là công khai

Câu hỏi của tôi là: structbằng cách nào đó đã bị bỏ rơi cho Class? Nếu vậy, tại sao? Khác với sự khác biệt ở trên, một người structcó thể làm tất cả những điều tương tự như một lớp học. Vậy tại sao lại từ bỏ nó?


bằng cách từ bỏ tôi có nghĩa là tại sao cái này được sử dụng hơn cái kia.
prometheuspk

Câu hỏi của bạn trả lời chính nó tôi nghĩ.
Umair A.

3
Sự khác biệt giữa các lớp và cấu trúc là phụ thuộc vào ngôn ngữ. Một số bài học từ C ++ không thực sự áp dụng cho C #.
Công việc

6
Uhhhh. Trong C ++, bạn có thể phân bổ các đối tượng trên stack hoặc heap. Bất cứ nơi nào bạn muốn.
jojo

8
Sai, sai, sai. Stack so với heap không có gì để làm với sự khác biệt.
Aaronaught

Câu trả lời:


11

Nó không bị bỏ rơi chút nào. Trên thực tế, ngay cả các ngôn ngữ hiện đại như C # sử dụng nhiều classvẫn cung cấp cho bạn struct. Về việc khi nào hữu ích để chọn cái khác, tôi giới thiệu cho bạn bài viết này:

Lựa chọn giữa các lớp và cấu trúc

Trích dẫn từ bài viết MSDN:

Xem xét việc xác định cấu trúc thay vì một lớp nếu các thể hiện của loại nhỏ và thường tồn tại trong thời gian ngắn hoặc thường được nhúng trong các đối tượng khác.

Không xác định cấu trúc trừ khi loại có tất cả các đặc điểm sau:

  • Nó đại diện một cách hợp lý một giá trị duy nhất, tương tự như các kiểu nguyên thủy (số nguyên, gấp đôi, v.v.).
  • Nó có kích thước cá thể nhỏ hơn 16 byte.
  • Nó là bất biến.
  • Nó sẽ không phải được đóng hộp thường xuyên.

4
Câu trả lời này thực sự sai lầm vì .Net / C # struct / class có nghĩa khác với C ++: chúng sử dụng cùng tên nhưng có ngữ nghĩa khác nhau tùy thuộc vào ngôn ngữ !!! Trong C ++ hầu như không có sự khác biệt giữa struct và class và câu hỏi hoàn toàn sai ở điểm đầu tiên, điều này đúng ở c # và D nhưng không phải ở c ++. Vì vậy, liên kết đến bài viết này, đó là về .Net, thực sự sai. Đó không phải là C ++!
Klaim

@Klaim về mặt kỹ thuật nó không phù hợp với C # (structs có thể nằm trong heap) Sự khác biệt quan trọng trong C # là giữa ngữ nghĩa giá trị và ngữ nghĩa tham chiếu, một sự khác biệt mà C ++ không cần vì nó có thể có giá trị hoặc tham chiếu cho bất cứ điều gì
jk.

17

Bạn đang nhầm về C ++: sự khác biệt đáng kể duy nhất giữa lớp và struct là sự khác biệt của trình xác định truy cập mặc định. Struct và class dành cho tất cả các từ đồng nghĩa và mục đích, tôi tin rằng struct được giữ xung quanh để tương thích ngược với C.


7
Không chỉ. Struct là một lựa chọn tốt khi bạn chỉ muốn kết xuất một loạt dữ liệu trong một đối tượng và không thêm bất kỳ hành vi nào vào đó.
quant_dev

2
@quant: Đó là một lý do khủng khiếp để sử dụng một cấu trúc. Tôi thực sự hy vọng rằng bình luận đó là tặc lưỡi.
Aaronaught

1
@Aaronaught Tại sao? Quan điểm của tôi về cách sử dụng struct khá chuẩn, xem câu trả lời này chẳng hạn: stackoverflow.com/questions/54585/
Kẻ

1
@Aaronaught Làm thế nào để bạn trả lại nhiều giá trị sau đó? Giả sử, một mô hình procing trả về giá sạch, giá bẩn và tổng các khoản thanh toán tích lũy.
quant_dev

1
@quant_dev - bạn có thể quyết định gắn một số ý nghĩa meta vào một cấu trúc cho mục đích của mình (và đối với các lập trình viên C trước đây thực sự có nhiều ý nghĩa), nhưng điều đó không thay đổi thực tế rằng sự khác biệt duy nhất giữa cấu trúc và từ khóa lớp trong C ++ là quyền truy cập mặc định.
Joris Timmermans

2

ngôn ngữ D đã tạo ra sự khác biệt lớn hơn giữa lớp và struct

một cấu trúc trong d không là gì ngoài một bản ghi dữ liệu được phân bổ ngăn xếp với một số chức năng bạn có thể gọi trên đó ( không có tùy chọn nào cho việc thừa kế trừ khi bạn sử dụng một thiết lập enum + union tức là tự thực hiện đa hình) được truyền theo giá trị

một lớp giống như chúng ta đã quen với: các hàm ảo, phân bổ heap, kế thừa (đơn), được truyền bởi ref

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.