Kelas versus Struct

12

Dalam C ++ dan bahasa yang dipengaruhi lainnya ada konstruksi yang disebut Struktur ( struct), dan yang lain disebut class. Keduanya mampu memegang fungsi dan variabel. Beberapa perbedaan adalah:

  1. Kelas diberi memori di heap dan structdiberikan memori di tumpukan (komentar: ini salah untuk C ++, tapi mungkin benar dalam apa yang disebut OP "bahasa yang dipengaruhi")
  2. Variabel kelas adalah pribadi secara default dan di structdalamnya bersifat publik

Pertanyaan saya adalah: apakah structentah bagaimana ditinggalkan untuk Kelas? Jika demikian, mengapa? Selain perbedaan di atas, a structdapat melakukan semua hal yang sama seperti kelas. Jadi mengapa meninggalkannya?

prometheuspk
sumber
dengan mengabaikan maksud saya mengapa satu digunakan di atas yang lain.
prometheuspk
pertanyaan Anda menjawab ini sendiri, saya pikir.
Umair A.
3
Perbedaan antara kelas dan struct bergantung pada bahasa. Beberapa pelajaran dari C ++ tidak benar-benar berlaku untuk C #.
Pekerjaan
6
Uhhhh. Dalam C ++ Anda dapat mengalokasikan objek pada tumpukan atau tumpukan. Dimanapun kamu mau.
jojo
8
Salah salah salah. Stack vs heap tidak ada hubungannya dengan perbedaan.
Aaronaught

Jawaban:

11

Itu tidak ditinggalkan sama sekali. Faktanya, bahkan bahasa modern seperti C # yang classmasih menggunakan Anda masih banyak struct. Adapun ketika berguna untuk memilih satu dari yang lain, saya merujuk Anda ke artikel ini:

Memilih Antara Kelas dan Struktur

Dikutip dari artikel MSDN:

Pertimbangkan mendefinisikan struktur alih-alih kelas jika instance tipe kecil dan umumnya berumur pendek atau umumnya tertanam dalam objek lain.

Jangan mendefinisikan struktur kecuali tipe memiliki semua karakteristik berikut:

  • Secara logis mewakili nilai tunggal, mirip dengan tipe primitif (integer, dobel, dan sebagainya).
  • Ini memiliki ukuran instance lebih kecil dari 16 byte.
  • Itu tidak berubah.
  • Itu tidak harus sering kotak.
blubb
sumber
4
Jawaban ini benar-benar salah arah karena .Net / C # struct / arti kelas berbeda dari C ++ satu: mereka menggunakan nama yang sama tetapi memiliki semantik yang berbeda tergantung pada bahasa !!! Dalam C ++ hampir tidak ada perbedaan antara struct dan kelas dan pertanyaannya benar-benar salah pada poin pertama, yang benar dalam c # dan D tetapi tidak dalam c ++. Jadi tautan ke artikel ini, yaitu tentang. Net, benar-benar salah. Ini bukan C ++!
Klaim
@Klaim secara teknis itu tidak tepat untuk C # baik (struct dapat di heap) Perbedaan penting dalam C # adalah antara semantik nilai dan semantik referensi, perbedaan bahwa C ++ tidak perlu karena dapat memiliki nilai atau referensi untuk apa pun
jk.
17

Anda salah tentang C ++: satu-satunya perbedaan signifikan antara kelas dan struct adalah perbedaan penentu akses default. Struct dan class adalah untuk semua maksud dan tujuan sinonim, saya percaya struct disimpan untuk kompatibilitas ke C.

Joris Timmermans
sumber
7
Tidak hanya. Struct adalah pilihan yang baik ketika Anda hanya ingin membuang banyak data dalam satu objek dan tidak menambahkan perilaku apa pun padanya.
quant_dev
2
@quant: Itu alasan mengerikan untuk menggunakan struct. Saya benar-benar berharap komentar itu tidak ada artinya.
Aaronaught
1
@Aaronaught Why? Pandangan saya tentang penggunaan struct cukup standar, lihat jawaban ini misalnya: stackoverflow.com/questions/54585/…
quant_dev
1
@Aaronaught Bagaimana Anda mengembalikan beberapa nilai? Katakanlah, model pembuktian mengembalikan harga bersih, harga kotor, dan jumlah pembayaran yang masih harus dibayar.
quant_dev
1
@quant_dev - Anda dapat memutuskan untuk melampirkan beberapa meta-makna ke struct untuk tujuan Anda (dan untuk mantan programmer C yang benar-benar masuk akal), tetapi itu tidak mengubah fakta bahwa satu-satunya perbedaan antara struct dan kata kunci kelas di C ++ adalah akses standar.
Joris Timmermans
2

bahasa D telah menciptakan perbedaan yang lebih besar antara kelas dan struct

struct di d tidak lain hanyalah stack data yang dialokasikan dengan beberapa fungsi yang dapat Anda panggil (tidak ada opsi untuk warisan kecuali Anda menggunakan enum + pengaturan serikat yaitu mengimplementasikan polymorfism sendiri) yang dilewatkan oleh nilai

kelas seperti kita terbiasa: fungsi virtual, alokasi tumpukan, (tunggal) warisan, disahkan oleh ref

aneh ratchet
sumber