Pertanyaan ini sudah ditanyakan dalam konteks C # /. Net .
Sekarang saya ingin mempelajari perbedaan antara struct dan kelas di C ++. Harap diskusikan perbedaan teknis serta alasan untuk memilih satu atau yang lain dalam desain OO.
Saya akan mulai dengan perbedaan yang jelas:
- Jika Anda tidak menentukan
public:
atauprivate:
, anggota struct adalah publik secara default; anggota kelas bersifat pribadi secara default.
Saya yakin ada perbedaan lain yang dapat ditemukan di sudut yang tidak jelas dari spesifikasi C ++.
struct
C dan C ++? Lihat di sini .struct
artinya di C ++. ;) Tetapi tidak ada alasan Anda tidak dapat menggunakanclass
kata kunci sebagai gantinya.Jawaban:
Anda lupa perbedaan 2 yang rumit antara kelas dan struct.
Quoth standar (§11.2.2 dalam C ++ 98 hingga C ++ 11):
Dan hanya demi kelengkapan, perbedaan yang lebih dikenal luas antara kelas dan struct didefinisikan dalam (11.2):
Perbedaan tambahan: kata kunci
class
dapat digunakan untuk mendeklarasikan parameter template, sedangkanstruct
kata kunci tidak dapat digunakan.sumber
class
, publik dengan standarstruct
, dan keduanya menentukan tipe kelas.struct
danclass
adalah bahwa yang terakhir dapat digunakan sebagai penggantitypename
untuk mendeklarasikan parameter templat, sedangkan yang pertama tidak bisa.:)
Mengutip FAQ C ++ ,
sumber
Perlu diingat asal-usul C ++, dan kompatibilitasnya dengan, C.
C memiliki struct, tidak memiliki konsep enkapsulasi, jadi semuanya bersifat publik.
Menjadi publik secara default umumnya dianggap ide yang buruk ketika mengambil pendekatan berorientasi objek, jadi dalam membuat bentuk C yang secara native kondusif untuk OOP (Anda dapat melakukan OO dalam C, tetapi itu tidak akan membantu Anda) yang merupakan ide di C ++ (awalnya "C Dengan Kelas"), masuk akal untuk membuat anggota pribadi secara default.
Di sisi lain, jika Stroustrup telah mengubah semantik
struct
sehingga anggotanya pribadi secara default, itu akan merusak kompatibilitas (itu tidak lagi sering benar seperti standar yang berbeda, tetapi semua program C yang valid juga merupakan program C ++ yang valid, yang memiliki efek besar pada memberi C ++ pijakan).Jadi kata kunci baru,
class
diperkenalkan persis seperti struct, tetapi pribadi secara default.Jika C ++ berasal dari awal, tanpa riwayat, maka mungkin hanya memiliki satu kata kunci tersebut. Mungkin juga tidak akan membuat dampak yang dibuatnya.
Secara umum, orang akan cenderung menggunakan struct ketika mereka melakukan sesuatu seperti bagaimana struct digunakan dalam C; anggota publik, tidak ada konstruktor (selama itu tidak dalam serikat, Anda dapat memiliki konstruktor dalam struct, seperti halnya dengan kelas, tetapi orang cenderung tidak), tidak ada metode virtual, dll. Karena bahasa lebih banyak untuk berkomunikasi dengan orang membaca kode untuk menginstruksikan mesin (atau kita akan tetap dengan perakitan dan opcodes VM mentah) itu ide yang baik untuk tetap dengan itu.
sumber
struct
di dalam*.c
file -File dan membiarkan unit terjemahan lain hanya menggunakannya dengan pointer. Jadi Anda memiliki enkapsulasi yang lebih kuat, karena unit terjemahan lain bahkan tidak tahu apa yang ada di dalamnyastruct
.Anggota kelas bersifat pribadi secara default. Anggota Struct bersifat publik secara default. Selain itu tidak ada perbedaan lainnya. Lihat juga pertanyaan ini .
sumber
struct
danclass
mendeklarasikan kelas dengan semantik identik (meskipun interpretasi parse-bijaksana dari tubuh definisi).Menurut Stroustrup dalam Bahasa Pemrograman C ++ :
Secara fungsional, tidak ada perbedaan selain publik / pribadi
sumber
STRUCT adalah tipe Tipe Data Abstrak yang membagi sebagian memori yang diberikan sesuai dengan spesifikasi struktur. Structs sangat berguna dalam serialisasi file / deserialization karena struktur sering dapat ditulis ke file verbatim. (mis. Dapatkan pointer ke struct, gunakan makro SIZE untuk menghitung jumlah byte yang akan disalin, kemudian pindahkan data masuk atau keluar dari struct.)
Kelas adalah tipe berbeda dari tipe data abstrak yang berusaha memastikan penyembunyian informasi. Secara internal, mungkin ada berbagai intrik, metode, variabel temp, variabel keadaan. dll. yang semuanya digunakan untuk menyajikan API yang konsisten ke kode apa pun yang ingin menggunakan kelas.
Akibatnya, struct adalah tentang data, kelas adalah tentang kode.
Namun, Anda perlu memahami bahwa ini hanyalah abstraksi. Sangat mungkin untuk membuat struct yang sangat mirip dengan kelas dan kelas yang sangat mirip dengan struct. Bahkan, kompiler C ++ paling awal hanyalah pra-kompiler yang menerjemahkan kode C ++ ke C. Jadi abstraksi ini adalah manfaat untuk pemikiran logis, belum tentu merupakan aset bagi komputer itu sendiri.
Selain fakta bahwa masing-masing adalah jenis abstraksi yang berbeda, Kelas memberikan solusi untuk teka-teki penamaan kode C. Karena Anda tidak dapat memiliki lebih dari satu fungsi yang terpapar dengan nama yang sama, pengembang digunakan untuk mengikuti pola _ (). mis. mathlibextreme_max (). Dengan mengelompokkan API ke dalam kelas, fungsi serupa (di sini kami menyebutnya "metode") dapat dikelompokkan bersama dan dilindungi dari penamaan metode di kelas lain. Ini memungkinkan programmer untuk mengatur kodenya lebih baik dan meningkatkan penggunaan kembali kodenya. Secara teori, setidaknya.
sumber
struct
kata kunci yang diwarisi .struct
deklarasikan kelas (termasukpublic
/private
/protected
, inheritance, dll).SIZE
Makro apa ini yang sedang Anda bicarakan?1) Anggota kelas bersifat pribadi secara default dan anggota struct bersifat publik secara default.
Misalnya program 1 gagal dalam kompilasi dan program 2 berfungsi dengan baik.
2) Ketika memperoleh struct dari kelas / struct, penentu akses default untuk kelas / struct dasar bersifat publik. Dan ketika menurunkan kelas, penentu akses default bersifat pribadi.
Misalnya program 3 gagal dalam kompilasi dan program 4 berfungsi dengan baik.
sumber
Satu-satunya perbedaan lainnya adalah warisan bawaan kelas dan struct, yang, secara mengejutkan, bersifat privat dan publik.
sumber
Ini pada VS2005.
sumber
_tmain
bukan standar C ++.Tidak ada dalam spesifikasi, tidak. Perbedaan utama adalah dalam harapan programmer ketika mereka membaca kode Anda dalam 2 tahun. struct sering diasumsikan sebagai POD. Structs juga digunakan dalam metaprogramming template ketika Anda mendefinisikan tipe untuk tujuan selain mendefinisikan objek.
sumber
Satu hal lagi yang perlu diperhatikan, jika Anda memperbarui aplikasi lawas yang memiliki struct untuk menggunakan kelas Anda mungkin mengalami masalah berikut:
Kode lama memiliki struct, kode dibersihkan dan ini diubah ke kelas. Satu atau dua fungsi virtual kemudian ditambahkan ke kelas baru yang diperbarui.
Ketika fungsi virtual berada di kelas maka secara internal kompiler akan menambahkan pointer tambahan ke data kelas untuk menunjuk ke fungsi.
Bagaimana ini akan mematahkan kode lama adalah jika dalam kode lama di suatu tempat struct dibersihkan menggunakan memfill untuk menghapus semuanya ke nol, ini akan menginjak data pointer tambahan juga.
sumber
calloc
mendukungnew
. Yang dapat dilakukan adalah mencoba memastikan bahwa struktur apa pun yang digunakan oleh bagian C dari kode sebenarnya adalah PODS.Anggota kelas yang ditentukan dengan kata kunci
class
secaraprivate
default. Anggota kelas yang ditentukan dengan kata kuncistruct
(atauunion
) secarapublic
default.Dengan tidak adanya akses-specifier untuk kelas dasar,
public
diasumsikan ketika kelas turunan dideklarasikanstruct
danprivate
diasumsikan ketika kelas dideklarasikanclass
.Anda dapat mendeklarasikan
enum class
tetapi tidakenum struct
.Anda bisa menggunakan
template<class T>
tetapi tidaktemplate<struct T>
.Perhatikan juga bahwa standar C ++ memungkinkan Anda untuk meneruskan mendeklarasikan tipe sebagai
struct
, dan kemudian gunakanclass
saat mendeklarasikan tipe dan sebaliknya. Juga,std::is_class<Y>::value
adalahtrue
untuk Y menjadistruct
danclass
, tetapifalse
untukenum class
.sumber
struct
danclass
dalam c + + adalah perbedaan antara kata kunci, bukan antara tipe data (atau beberapa alternatif yang lebih baik;)std::is_class<Y>::value
mencakup itu?Perbedaan antara
class
danstruct
merupakan perbedaan antara kata kunci, bukan antara tipe data. Dua inikeduanya mendefinisikan tipe kelas. Perbedaan kata kunci dalam konteks ini adalah perbedaan akses standar:
foo::x
bersifat publik danfoo_base
diwarisi secara publikbar::x
bersifat pribadi danbar_base
diwarisi secara pribadisumber
Berikut ini penjelasan yang bagus: http://carcino.gen.nz/tech/cpp/struct_vs_class.php
sumber
Itu hanya sebuah konvensi. Structs dapat dibuat untuk menampung data sederhana tetapi kemudian berkembang waktu dengan penambahan fungsi dan konstruktor anggota. Di sisi lain, tidak biasa melihat selain publik: akses dalam sebuah struct.
sumber
sumber
Perbedaan utama lainnya adalah ketika datang ke Template. Sejauh yang saya tahu, Anda dapat menggunakan kelas ketika Anda mendefinisikan template tetapi BUKAN struct.
sumber
struct
tidak diperbolehkan di sana hanya dengan konvensi (lebih baik katakan ituclass
kata kunci yang digunakan dalam arti berbeda di sini, lihat Menggunakan 'class' atau 'typename' untuk parameter template ).struct
baik. Coba saja.struct T{}; template <typename T> void foo() {} foo<T>();
Jawaban lain telah menyebutkan default privat / publik, (tetapi perhatikan bahwa struct adalah kelas adalah struct; mereka bukan dua item yang berbeda, hanya dua cara mendefinisikan item yang sama).
Apa yang mungkin menarik untuk dicatat (terutama karena penanya cenderung menggunakan MSVC ++ karena ia menyebutkan "tidak dikelola" C ++) adalah bahwa Visual C ++ mengeluh dalam keadaan tertentu jika suatu kelas dideklarasikan dengan
class
dan kemudian didefinisikan denganstruct
(atau mungkin sebaliknya) ), meskipun standar mengatakan itu sangat legal.sumber
. Di kelas semua anggota secara default bersifat pribadi tetapi dalam struktur anggota adalah publik secara default.
Tidak ada istilah seperti konstruktor dan destruktor untuk struct, tetapi untuk kompiler kelas membuat default jika Anda tidak menyediakan.
Struktur kosong Sizeof adalah 0 Bytes karena kelas kosong Sizeof adalah 1 Byte Jenis akses default struct adalah publik. Suatu struct biasanya harus digunakan untuk mengelompokkan data.
Jenis akses standar kelas adalah pribadi, dan mode default untuk warisan adalah pribadi. Kelas harus digunakan untuk mengelompokkan data dan metode yang beroperasi pada data itu.
Singkatnya, konvensi adalah untuk menggunakan struct ketika tujuannya adalah untuk mengelompokkan data, dan menggunakan kelas ketika kita membutuhkan abstraksi data dan, mungkin warisan.
Dalam C ++ struktur dan kelas diteruskan oleh nilai, kecuali secara eksplisit dide-referensikan. Dalam bahasa lain, kelas dan struktur mungkin memiliki semantik yang berbeda - yaitu. objek (turunan kelas) dapat diteruskan dengan referensi dan struktur dapat diteruskan oleh nilai. Catatan: Ada komentar yang terkait dengan pertanyaan ini. Lihat halaman diskusi untuk menambah percakapan.
sumber
g++
. Anda mungkin berpikir tentang Optimalisasi Basis Kosong, tetapi itu berlaku untuk keduanya juga.struct
membuat kelas penuh di C ++.Walaupun tersirat oleh jawaban lain, itu tidak disebutkan secara eksplisit - bahwa struct adalah C kompatibel, tergantung pada penggunaan; kelas tidak.
Ini berarti jika Anda sedang menulis header yang Anda ingin menjadi kompatibel C maka Anda tidak punya pilihan selain struct (yang di dunia C tidak dapat memiliki fungsi; tetapi dapat memiliki pointer fungsi).
sumber
Anda dapat mempertimbangkan ini sebagai pedoman kapan harus pergi untuk struct atau kelas, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .
sumber
Kelas hanya bermakna dalam konteks rekayasa perangkat lunak. Dalam konteks struktur data dan algoritma, kelas dan struct tidak jauh berbeda. Tidak ada aturan yang dibatasi bahwa anggota kelas harus dirujuk.
Ketika mengembangkan proyek besar dengan banyak orang tanpa kelas, Anda mungkin akhirnya mendapatkan kode yang rumit karena semua orang menggunakan fungsi dan data apa pun yang mereka inginkan. class memberikan kontrol izin dan inheren untuk meningkatkan decoupling dan menggunakan kembali kode.
Jika Anda membaca beberapa prinsip rekayasa perangkat lunak, Anda akan menemukan sebagian besar standar tidak dapat diimplementasikan dengan mudah tanpa kelas. misalnya: http://en.wikipedia.org/wiki/ LAPORAN_ % 28object-oriented_design%29
BTW, Ketika sebuah struct mengalokasikan kegemparan memori dan mencakup beberapa variabel, variabel tipe nilai menunjukkan bahwa nilai-nilai tertanam di mana struct dialokasikan. Sebaliknya, nilai-nilai variabel tipe referensi adalah eksternal dan referensi oleh pointer yang juga tertanam di mana struct dialokasikan.
sumber
struct
deklarasikan kelas (termasuk kontrol izin, pewarisan, dll).Perbedaan antara kata kunci struct dan kelas dalam C ++ adalah bahwa, ketika tidak ada specifier spesifik pada tipe data komposit tertentu maka secara default struct atau gabungan adalah kata kunci publik yang hanya menganggap penyembunyian data tetapi kelas adalah kata kunci pribadi yang menganggap penyembunyian program kode atau data. Selalu beberapa programmer menggunakan struct untuk data dan kelas demi kode. Untuk informasi lebih lanjut, hubungi sumber lain.
sumber
struct
anggota adalah publik secara default, dan jawaban yang diterima dari 2009 menyebutkan pewarisan. Mengapa menulis jawaban lain yang tidak menambahkan informasi baru 4 tahun kemudian?Dari semua faktor ini, dapat disimpulkan bahwa konsep Kelas sangat cocok untuk mewakili objek dunia nyata daripada "Struktur". Terutama karena konsep OOP yang digunakan di kelas sangat praktis dalam menjelaskan skenario dunia nyata sehingga lebih mudah untuk menggabungkannya dengan kenyataan. Sebagai contoh, warisan bawaan adalah publik untuk struct tetapi jika kita menerapkan aturan ini untuk dunia nyata, itu konyol. Tapi dalam warisan bawaan kelas adalah privat yang lebih realistis.
Bagaimanapun, apa yang perlu saya benarkan adalah Kelas adalah konsep yang lebih luas, dunia nyata yang berlaku sedangkan Struktur adalah Konsep primitif dengan organisasi internal yang buruk (Walaupun struct mengikuti konsep OOP, mereka memiliki makna yang buruk)
sumber
Perbedaan utama antara struktur dan kata kunci kelas dalam oops adalah bahwa, tidak ada deklarasi anggota publik dan pribadi yang hadir dalam struktur. Dan fungsi anggota dan data anggota dapat didefinisikan sebagai publik, pribadi, dan juga dilindungi.
sumber
struct
deklarasikan kelas (termasukpublic
/private
/protected
, inheritance, dll).** PEMBARUAN: ** Harap abaikan balasan ini. Saya tidak mempertimbangkan kemungkinan bahwa untuk struct, nilainya tidak diinisialisasi tetapi kebetulan menjadi 0. Tidak ada perbedaan inisialisasi antara struct dan kelas.
Saya melihat perbedaan lain antara struct dan kelas yang berkaitan dengan inisialisasi default.
Jalankan kode itu dan periksa myTester. Anda akan menemukan bahwa untuk m_Foo, struct, m_Foo.a telah diinisialisasi ke 0, tetapi untuk m_Bar, kelas, m_Bar.a tidak diinisialisasi. Jadi tampaknya ada perbedaan dalam apa yang dilakukan konstruktor default untuk struct vs kelas. Saya melihat ini dengan Visual Studio.
sumber
m_Foo.a
itu diinisialisasi? Bagaimana jika itu tidak diinisialisasi dan kebetulan0
?Perbedaan utama antara struct dan kelas adalah bahwa dalam struct Anda hanya dapat mendeklarasikan variabel data dari tipe data yang berbeda sementara di kelas Anda dapat mendeklarasikan variabel data, fungsi anggota dan dengan demikian Anda dapat memanipulasi variabel data melalui fungsi.
-> Hal lain yang berguna yang saya temukan di kelas vs struct adalah ketika mengimplementasikan file dalam suatu program jika Anda ingin membuat beberapa operasi struct lagi dan lagi pada setiap set operasi baru Anda perlu membuat fungsi terpisah dan Anda perlu lewat objek struct setelah membacanya dari file sehingga membuat beberapa operasi di atasnya. sementara di kelas jika Anda membuat fungsi yang melakukan beberapa operasi pada data yang dibutuhkan setiap kali..sangat mudah Anda hanya perlu membaca objek dari file dan memanggil fungsi ..
Tapi itu tergantung pada programmer mana yang menurutnya cocok ... menurut saya saya lebih suka kelas setiap kali hanya karena mendukung OOP dan itulah alasan penerapannya di hampir setiap bahasa dan fitur yang luar biasa dari semua pemrograman waktu; - )
Dan ya perbedaan yang paling tidak terlupakan yang saya lupa sebutkan adalah bahwa kelas mendukung penyembunyian data dan juga mendukung operasi yang dilakukan pada tipe data yang dibangun sementara struct tidak!
sumber
struct
dapat memiliki fungsi anggotastruct
dapat memiliki konstruktor, fungsi anggota dan distruktor (mungkin virtual, mungkin pribadi, dilindungi, atau publik). Mereka bisa mewarisi dan diwarisi. jadi sebenarnya ... semua yang dimiliki kelas. konvensi tipical adalah mendeklarasikan dengan struct apa yang akan Anda deklarasikan sebagai struct di C, dan sebagai kelas jika kita mendeklarasikan variabel pribadi dan yang dilindungi, fungsi virtual, ctor dan dtor, dan sebagainya. Tapi itu hanya sebuah konvensi, tidak dipaksakan oleh bahasaSaya menemukan perbedaan lain. jika Anda tidak mendefinisikan konstruktor di kelas, kompiler akan menentukan satu. tetapi dalam sebuah struct jika Anda tidak mendefinisikan konstruktor, kompiler tidak mendefinisikan konstruktor juga. jadi dalam beberapa kasus kita benar-benar tidak memerlukan konstruktor, struct adalah pilihan yang lebih baik (tip kinerja). dan maaf untuk bahasa Inggris saya yang buruk.
sumber
struct
kata kunci dan kelas yang didefinisikan denganclass
kata kunci dalam hal ini.Kelas adalah tipe Referensi dan Struktur adalah tipe Nilai.
Ketika saya mengatakan Kelas adalah tipe referensi,
pada dasarnya mereka akan berisi alamat variabel instan.
Sebagai contoh:
Dalam metode utama,
saya dapat membuat turunan dari kelas ini menggunakan operator baru yang mengalokasikan memori untuk kelas ini
dan menyimpan alamat basis itu ke dalam variabel tipe MyClass (_myClassObject2).
Dalam program di atas, MyClass _myClassObject2 = _myClassObject1; instruksi menunjukkan bahwa kedua variabel tipe MyClass
dan akan menunjuk ke lokasi memori yang sama.
Ini pada dasarnya menetapkan lokasi memori yang sama ke dalam variabel lain dengan tipe yang sama.
Jadi jika ada perubahan yang kita buat pada salah satu objek, ketik MyClass akan memiliki efek pada yang lain
karena keduanya menunjuk ke lokasi memori yang sama.
"_myClassObject1.DataMember = 10;" pada baris ini kedua anggota data objek akan berisi nilai 10.
"_myClassObject2.DataMember = 20;" pada baris ini kedua anggota data objek akan berisi nilai 20.
Akhirnya, kita mengakses data dari suatu objek melalui pointer.
Tidak seperti kelas, struktur adalah tipe nilai. Sebagai contoh:
Dalam program di atas,
instantiate objek tipe MyStructure menggunakan operator baru dan
menyimpan alamat ke dalam variabel _myStructObject dari tipe MyStructure dan
menetapkan nilai 10 untuk anggota data struktur menggunakan "_myStructObject1.DataMember = 10".
Pada baris berikutnya,
saya mendeklarasikan variabel lain _myStructObject2 dari tipe MyStructure dan menugaskan _myStructObject1 ke dalamnya.
Di sini .NET C # compiler membuat salinan lain dari objek _myStructureObject1 dan
menetapkan lokasi memori itu ke dalam variabel MyStructure _myStructObject2.
Jadi perubahan apa pun yang kita buat pada _myStructObject1 tidak akan pernah berpengaruh pada variabel lain _myStructObject2 dari tipe MyStructrue.
Itu sebabnya kami katakan Struktur adalah tipe nilai.
Jadi kelas Base langsung untuk kelas adalah Object dan kelas Base langsung untuk Struktur adalah ValueType yang mewarisi dari Obyek.
Kelas akan mendukung Warisan sedangkan Struktural tidak akan.
Bagaimana kita mengatakan itu?
Dan apa alasan di balik itu?
Jawabannya adalah Kelas.
Itu bisa abstrak, disegel, statis, dan parsial dan tidak bisa pribadi, dilindungi dan dilindungi internal.
sumber
struct
danclass
. Tidak ada seorang pun di sini yang menyebutkannya, atau seluruh web. Jadi saya tidak berpikir ini berlaku untuk C ++ juga.int a = 3; int b = a;
dan yang serupaMyStruct a=MyStruct("data"); MyStruct b = a;
Ada 3 perbedaan mendasar antara struktur dan kelas
Memori 1St- dicadangkan untuk struktur dalam memori stack (yang dekat dengan bahasa pemrograman) apakah untuk kelas dalam memori stack dicadangkan hanya untuk reffrence dan memori aktual dicadangkan dalam memori tumpukan.
2Nd - Secara default struktur memperlakukan sebagai publik apakah kelas memperlakukan sebagai pribadi.
3Rd- tidak dapat menggunakan kembali kode dalam struktur tetapi di kelas kita dapat menggunakan kembali kode yang sama dalam banyak waktu yang disebut inhertence
sumber