2009-02-12 34 views
17

Khi ai đó nên sử dụng cấu trúc thay vì các lớp hoặc ngược lại trong C++? Tôi thấy bản thân mình sử dụng cấu trúc khi một lớp học toàn diện quản lý một số thông tin có vẻ như quá mức cần thiết nhưng muốn cho biết thông tin được chứa đều có liên quan. Tôi đã tự hỏi một số hướng dẫn tốt để có thể biết khi nào thì phù hợp hơn cái kia?Structs vs classes in C++

Edit: Tìm thấy những liên kết này trong khi đọc các tài liệu Stack Overflow chỉ có liên quan sau khi câu hỏi đã được gửi:

When should you use a class vs a struct in C++?
What are the differences between struct and class in C++?

+0

vì vậy đây là bản sao rồi – ChrisW

Trả lời

14

Về mặt kỹ thuật, sự khác biệt duy nhất giữa hai là cấu trúc là công khai: theo mặc định và các lớp là private:

Ngoài ra, không có sự khác biệt về kỹ thuật.

struct vs class sau đó trở thành sắc thái hoàn toàn biểu cảm của ngôn ngữ.

Thông thường, bạn tránh đặt các phương thức phức tạp vào một cấu trúc và hầu hết các thành phần dữ liệu cấu trúc sẽ được công khai. Trong một lớp học bạn muốn thực thi đóng gói mạnh mẽ.

struct = dữ liệu là công khai, với các phương pháp helper rất đơn giản

class = đóng gói mạnh mẽ, dữ liệu được sửa đổi/truy cập chỉ thông qua phương pháp

+0

Tuy nhiên, OP đã yêu cầu các nguyên tắc, phụ thuộc vào sắc thái biểu cảm. –

2

Sử dụng một lớp nếu bạn có phương pháp, một cấu trúc nếu không muốn nói .

Một lớp nên ẩn tất cả nội bộ của nó chỉ hiển thị các phương thức hoặc thuộc tính. Một cấu trúc có xu hướng phơi bày tất cả các bên trong của nó và không có phương thức truy cập.

Trong trường hợp chỉ một bit mã đang truy cập một số dữ liệu (có liên quan), cấu trúc có thể hoàn toàn hợp lý. Trường hợp nhiều bit của mã cần phải sửa đổi dữ liệu hoặc nếu nó là bất cứ điều gì hơi phức tạp, một lớp sẽ là một đặt cược tốt hơn.

5

tôi sử dụng cấu trúc container đơn giản của các loại cung cấp không có nhà thầu hoặc nhà khai thác .

Lớp học cho mọi thứ khác.

1

Sự khác biệt giữa các lớp và cấu trúc là các cấu trúc là các nhóm biến và lớp đại diện cho các đối tượng. Các đối tượng có các thuộc tính và các phương thức và là một phần của một hệ thống phân cấp.

Nếu bạn đang sử dụng C++ để tận dụng các khả năng của OO, tốt nhất là sử dụng các lớp/đối tượng tự nhiên hơn.

+0

Câu trả lời hay nhất mà tôi từng thấy "cấu trúc là các nhóm biến và lớp đại diện cho các đối tượng" – Glolita

0

Cá nhân, tôi sử dụng cấu trúc khi tất cả tôi cần là một container cho dữ liệu (không có chức năng thành viên). Nếu không, tôi sử dụng các lớp học.

Thời gian duy nhất tôi tạo ngoại lệ cho quy tắc đó là nếu tôi cần một trình rút gọn đơn giản: ví dụ:

struct compare { bool operator() { ... } }; 
sort(v.begin(), v.end(), compare()); 

Cần có nhãn public: sẽ làm lộn xộn mã không cần thiết.

+0

Đó là hướng dẫn google C++ khá nhiều. Không phải là tôi làm theo/như hướng dẫn của họ trong nhiều khía cạnh khác. –

0

cấu trúc trong C++ là các lớp có phương thức truy cập mặc định của công chúng, vì vậy về mặt kỹ thuật khác với mặc định không có sự khác biệt và bạn có thể sử dụng cả hai tương đương.

Tuy nhiên, có một số kỳ vọng và khuynh hướng tự nhiên, một phần vì cấu trúc trong C++ đến từ C.

cách tiếp cận của tôi: Nếu có bất kỳ dữ liệu cá nhân, một constructor/destructor, hay bất kỳ chức năng thành viên phức tạp (mà làm nhiều hơn là chỉ chuyển đổi khi thiết lập/nhận, vv), sử dụng lớp.

1

Tôi luôn sử dụng lớp, ngay cả đối với các thùng chứa, để nhất quán. Nó hoàn toàn là một sự lựa chọn phong cách vì sự khác biệt giữa hai là không đáng kể.

4

Sử dụng cấu trúc khi bạn chỉ cần một "nhóm nội dung" không có bất biến hợp lý mà bạn cần giữ lại. Sử dụng một lớp học cho bất cứ điều gì khác.

Xem thêm số C++ FAQ says on the subject.

1

Nếu bạn cần kiểm soát quyền truy cập vào dữ liệu, bạn nên sử dụng các lớp học. Nếu bạn không quan tâm ai đang truy cập cái gì, và những gì họ đang lưu trữ trong đó, thì một cấu trúc có lẽ là thích hợp hơn.

Ngoài ra, một lớp học phù hợp hơn nếu bạn cần thực hiện bất kỳ kiểm tra nào về tính toàn vẹn của dữ liệu.

+1

Tôi tìm thấy hai downvotes về câu trả lời này, trông hoàn toàn tốt với tôi. Đưa cái gì? –

+0

Đập tôi. Tôi đã nhận được một cái gì đó sai ở đây? Nếu tôi hoàn toàn sai về điều này, thì tôi thực sự muốn biết làm thế nào ... –

+0

thx. Tôi không thực sự quan tâm nếu đó là câu trả lời được đánh giá cao nhất; Tôi chỉ muốn biết tại sao nó đã sai ... rõ ràng, 2 người nghĩ rằng đó là loại sai. Ah, tốt. –