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?


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.

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.