C dan kemungkinan besar banyak bahasa lain menyediakan struct
kata kunci untuk membuat struktur (atau sesuatu dengan cara serupa). Ini (setidaknya dalam C), dari sudut pandang yang disederhanakan seperti kelas, tetapi tanpa polimorfisme, pewarisan, metode, dan sebagainya.
Pikirkan bahasa berorientasi objek (atau multi-paradigma) dengan struct gaya-C. Di mana Anda memilih mereka daripada kelas? Sekarang, saya tidak percaya mereka akan digunakan dengan OOP karena kelas tampaknya menggantikan tujuan mereka, tetapi saya bertanya-tanya apakah ada situasi di mana mereka dapat lebih disukai daripada kelas dalam program berorientasi objek dan dalam situasi seperti apa. Apakah ada situasi seperti itu?
Jawaban:
Ada perbedaan yang saya lihat di beberapa buku antara benda pembawa negara dan benda penyedia fungsi. Istilah yang tepat berbeda dari sumber ke sumber. Tetapi secara umum, yang pertama dibedakan dengan memiliki banyak bidang dan sejumlah besar pengambil-setter berpasangan (dan mungkin konstruktor).
Ini sangat umum di Jawa, untuk kelas yang secara eksplisit ditandai sebagai "serializable".
Saya berpendapat bahwa kelas semacam ini paling masuk akal sebagai struct, jika Anda merasa tidak perlu menyembunyikan anggota secara langsung (misalnya, dalam hal tipe bertumpuk).
sumber
Di C, tidak ada kelas, jadi
struct
adalah cara untuk menggabungkan data. Dalam C ++,struct
sama denganclass
kecuali bahwa pewarisan dan akses anggotapublic
secara default bukanprivate
. C # juga memiliki semacamstruct
, tetapi saya tidak cukup tahu C # untuk mengomentarinya. Common Lisp memilikidefstruct
bentuk, yang berfungsi seperti halnya Csstruct
, mengingat perbedaan bahasa, dan berbeda dari kelas Common Lisp Object System.Namun, ada perbedaan konseptual antara bundel data terkait dan kelas nyata, dan dalam C ++
struct
sering digunakan untuk bundel data, sementaraclass
digunakan untuk objek yang seharusnya memiliki perilaku mereka sendiri. Sebagai pedoman, saya akan mengatakan bahwaclass
mewakili sesuatu yang dapat Anda katakan sesuatu yang bermanfaat, seperti kelas invarian, sementara astruct
akan lebih longgar digabungkan dengan nilai data yang tidak terlalu tergantung pada yang lain.sumber
struct
dan aclass
lebih signifikan dalam C # - yang paling penting adalah astruct
adalah tipe nilai dan aclass
adalah tipe referensi. Microsoft merekomendasikan untuk tidak menggunakanstruct
jika isinya akan lebih besar dari 16 byte atau lebih.Pada tingkat yang sangat mendasar, apa perbedaan antara struct dan kelas data murni (yang tidak memiliki fungsi selain dari aksesor properti)?
Hanya jejak memori.
sumber
Jawaban yang diterima bagus. Saya hanya ingin menambahkan ....
Terkadang lebih baik menempatkan metode di dalam kelas. Lain kali lebih baik memiliki fungsi eksternal di mana struct / kelas dilewatkan sebagai parameter (bahkan jika Anda melakukan gaya OOP).
contoh kapan harus meletakkan metode di dalam kelas: Rectangle.CaclulateArea ()
contoh kapan harus meletakkan fungsi di luar kelas: Canvas.Draw (Rectangle rect)
Anda bisa meletakkan Draw () di dalam Rectangle dan itu akan berhasil. Tetapi menggambar adalah operasi yang bergantung pada tingkat. Anda tidak akan menggambar di sisi server, tetapi di sisi klien. Draw () tidak masuk akal bahkan ada di server. Namun "CalculateArea ()" tidak tergantung pada tier dan merupakan atribut sebenarnya dari persegi panjang, jadi lebih baik untuk memasukkannya sebagai metode anggota.
sumber
Bagi saya, perbedaan besar adalah apakah ada kelas-invarian atau tidak.
Atau dengan kata lain: apakah saya bebas mengubah bidang apa pun ke nilai apa pun kapan saja? Jika demikian, itu adalah struct; Jika tidak, ini kelas.
Contoh biasa dari struct adalah titik 2D, dengan hanya anggota X dan Y, yang dapat memiliki nilai apa pun dan benar-benar independen satu sama lain. Akses publik dapat diterima.
Contoh kelas adalah kombinasi pointer ke array karakter dan bidang panjang: panjangnya tergantung pada nilai pointer, dan dengan demikian seharusnya tidak menjadi sebuah struct. Ladang harus pribadi, dan akses harus melalui setter dan getter untuk memastikan kelas invarian.
sumber
1) Jaringan
struct
: struktur yang ditransmisikan melalui kabel.Secara umum dan formal, setiap kelas yang Anda perlukan adalah POD, sepele, tata letak standar, atau konsep terkait. Untuk diskusi yang sangat baik dari konsep-konsep ini, dengan contoh, lihat jawaban ini (ini untuk C ++ 11).
2) Functors (predikat khususnya), yang akan Anda lewati untuk fungsi seperti
std::remove_if
. Jika tidak, kelas mirip dengan / diwarisi daristd::binary_function
atau sejenisnya.3) Konsep pemrograman Meta, yang mungkin hanya berisi publik
constexpr
, dan / atautypedef
s.Sunting: Catatan: Jawaban ini berlaku untuk kelas C ++ vs struct.
sumber