2013-07-29 39 views
6

Sử dụng struct chúng tôi có thể đạt được tất cả chức năng của class: các nhà xây dựng (có thể được sửa đổi/quá tải), hủy (có thể được sửa đổi/quá tải), quá tải nhà điều hành, phương pháp mẫu, phương pháp tĩnh, public/private/protected trường/phương pháp.Tại sao chúng ta cần một `lớp` trong C++, khi một` struct` có thể được sử dụng để đạt được như vậy?

Tại sao chúng ta cần class sau đó?

Lưu ý: Tôi không muốn câu trả lời nói rằng trong struct, trường/phương thức là public theo mặc định.

+0

Tôi muốn nói đó là lý do tương thích 'lịch sử' với [tag: c]. –

+0

Có thể thực hiện đóng gói dữ liệu, ẩn dữ liệu với cấu trúc –

+0

Getter (accessors), setters (mutators) có một số ý nghĩa trong OOPs mà chúng ta có thể đạt được trong các lớp và không có trong cấu trúc –

Trả lời

8

Bạn không cần cần lớp học, ngôn ngữ này chỉ cung cấp cho bạn một tùy chọn khác để chọn. Về mặt kỹ thuật, bạn nói đúng, bạn có thể đạt được bất cứ điều gì một class có thể làm với một struct. Ngoài mức truy cập mặc định, cũng có nghĩa là hầu hết các lập trình viên liên kết với hai - struct thường có nghĩa là trọng lượng nhẹ, thường là POD, loại dữ liệu có ít hoặc không có chức năng. A class thường được kết hợp với thứ gì đó lớn hơn.

+1

Nó thậm chí có thể đáng nói đến là bản thân tiêu chuẩn không phân biệt giữa hai chữ trong văn bản của nó. Nghĩa là, một "lớp" có thể được định nghĩa bằng cách sử dụng từ khoá 'lớp' hoặc từ khóa' struct'. – Angew

+0

@Bạn muốn trở thành "loại lớp", phải không? –

+0

"với thứ gì đó lớn hơn". Nó sẽ không được "bao gồm các chức năng"? Tôi biết nó không tạo ra sự khác biệt, chỉ là cách tôi trải nghiệm nó. POD vs Loại có chức năng. – JBL

0

Không có sự khác biệt nào giữa C++ struct và C++ class, bạn có thể thực hiện gần như tất cả các hàm có cấu trúc như bạn có thể làm với lớp, nhưng struct là từ khóa C dần dần sửa đổi/phát triển trong C++ và được đặt tên là lớp . Chúng ta đang ở trong C++, tốt hơn là sử dụng class chứ không phải là struct. Lấy ví dụ, nếu bạn đã thực hiện một số mã hóa trong C++ và một số người làm việc trong Java đến sau 2 tháng để xem lại mã của bạn, bạn sẽ cảm thấy thoải mái khi hiểu mã với "struct" hoặc mã "lớp học"?

+1

Bạn có thể làm gì với một 'lớp' mà bạn không thể làm với một' cấu trúc'? – jamesdlin

+0

Mọi thứ có thể được thực hiện với cấu trúc C++ có thể được thực hiện với lớp C++, nhưng tôi nghĩ cá nhân lớp đó trông đẹp hơn cấu trúc trong C++. Nếu không Stroutstrup sẽ không giới thiệu các từ khóa ở tất cả .. Bạn nghĩ gì? – Saby

+1

Nhưng bạn nói "bạn có thể thực hiện gần như tất cả các chức năng ...". Làm thế nào là nó "gần như"? – jamesdlin

1

Để tạo một câu chuyện dài ngắn, class thực sự không cần thiết chút nào. Nó thay đổi mặc định cho những cái được cho là an toàn hơn và phù hợp hơn với lập trình OO, nhưng bạn có thể sử dụng struct (như được định nghĩa bởi C++) cho bất kỳ địa điểm nào bạn đang sử dụng class (nếu bạn muốn trở nên dễ thương và siêu việt về nó, bạn có thể gọi struct một lớp cơ sở là class thỏa mãn LSP).

Đồng thời, sự hiểu lầm của struct trong C++ là tràn lan và class phù hợp với khái niệm dự định đủ tốt hơn để giải thích dễ dàng hơn nhiều. Người dùng mới thường dường như tìm thấy nó ít nhất là dễ hiểu hơn - một mục tiêu hợp lý trong chính nó.

1

class đơn giản là tên được chấp nhận phổ biến trong OO đối với loại được sử dụng cho các đối tượng instantiating. Khi giới thiệu mô hình OO trong C++, nó được coi là ít ngạc nhiên khi sử dụng class thay vì struct.

struct được giữ để tối đa hóa khả năng tương thích ngược với C.

sử dụng trong hai hôm nay là phù hợp với điều này: struct thường được sử dụng với nhiều loại POD C-phong cách, trong khi class được sử dụng cho các khái niệm OO của các lớp học.

3

Như Tal Pressman đã trả lời tại When should you use a class vs a struct in C++?:

Từ ++ FAQ C:

Các thành viên và các lớp cơ sở của một struct là công khai theo mặc định, trong khi ở lớp, họ mặc định riêng. Lưu ý: bạn nên đặt các lớp cơ sở của mình thành công khai, riêng tư hoặc được bảo vệ, thay vì dựa vào các giá trị mặc định.

cấu trúc và lớp học có chức năng tương đương.

OK, đủ để nói chuyện kỹ thuật sạch sẽ. Về mặt tình cảm, hầu hết các nhà phát triển tạo ra một sự phân biệt mạnh mẽ giữa một lớp và một cấu trúc. Một cấu trúc đơn giản cảm thấy giống như một đống mở với rất ít trong cách đóng gói hoặc chức năng. Một lớp học cảm thấy như một thành viên sống động và có trách nhiệm của xã hội với các dịch vụ thông minh, một rào cản đóng gói mạnh mẽ, và một giao diện được xác định rõ ràng. Vì đó là ý nghĩa của hầu hết mọi người, bạn nên sử dụng từ khóa struct nếu bạn có một lớp có rất ít phương thức và có dữ liệu công khai (những thứ như vậy tồn tại trong các hệ thống được thiết kế tốt), nhưng nếu không bạn nên sử dụng lớp đó từ khóa.

http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.8

Tôi nghĩ rằng một trong Ngoài lý do này có thể là C đã có cấu trúc. Khi Bjarne Stroustrup thiết kế C++, anh ta muốn thêm các lớp với tất cả các chức năng mà bạn đã liệt kê trong câu hỏi ban đầu của bạn, các tính năng không có trong C. Khi triển khai các tính năng đó, anh ta có thể nhận ra nó không có ý nghĩa struct và class (ngoại trừ public/private default visibility).

TL/DR: trong cấu trúc/lớp C++ mô tả mục đích của lập trình viên để có POD hoặc trừu tượng phức tạp hơn và việc giới thiệu từ khóa lớp có thể ở đây vì lý do lịch sử (thêm từ khóa bổ sung để tạo tính năng đầy đủ) các lớp, sau đó backport các tính năng đó vào từ khóa struct vì nó thực dụng hơn để thực hiện).