Apa perbedaan antara struct dan kelas di C ++?

441

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:atau private:, 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 ++.

palm3D
sumber
6
Tautan ini merangkum perbedaan dengan baik.
sjsam
1
Mengapa semua orang menggunakan struct untuk membangun pohon? Karena sepertinya perbedaannya tidak banyak. BTW, Itu adalah situs web yang bagus. @ Sjsam
JW.ZG
1
Mencari perbedaan antara structC dan C ++? Lihat di sini .
Marc.2377
@ JW.ZG Tidak "semua" orang lakukan! Mereka yang melakukan itu hanya lebih suka, atau tidak menyadari apa structartinya di C ++. ;) Tetapi tidak ada alasan Anda tidak dapat menggunakan classkata kunci sebagai gantinya.
Lightness Races di Orbit

Jawaban:

466

Anda lupa perbedaan 2 yang rumit antara kelas dan struct.

Quoth standar (§11.2.2 dalam C ++ 98 hingga C ++ 11):

Dengan tidak adanya akses-specifier untuk kelas dasar, publik diasumsikan ketika kelas turunan dinyatakan struct dan pribadi diasumsikan ketika kelas tersebut dinyatakan sebagai kelas .

Dan hanya demi kelengkapan, perbedaan yang lebih dikenal luas antara kelas dan struct didefinisikan dalam (11.2):

Anggota kelas yang ditentukan dengan kelas kata kunci adalah pribadi secara default. Anggota kelas yang didefinisikan dengan kata kunci struct atau gabungan adalah publik secara default.

Perbedaan tambahan: kata kunci classdapat digunakan untuk mendeklarasikan parameter template, sedangkan structkata kunci tidak dapat digunakan.

Assaf Lavie
sumber
22
Itu sebenarnya bukan perbedaan kedua, hanya saja pertanyaannya menyatakan perbedaan itu tidak lengkap. Semua sub-proyek bersifat pribadi secara default saat menggunakan class, publik dengan standar struct, dan keduanya menentukan tipe kelas.
Ben Voigt
10
Saya pikir Anda melewatkan intinya, Ben. Ini adalah warisan yang bersifat publik untuk struct dan privat untuk kelas. Itu perbedaan yang sangat penting, dan sama sekali tidak terkait dengan akses anggota yang sebenarnya. Sebagai contoh, bahasa tersebut dapat mendefinisikannya dengan baik jika tidak, misalnya keduanya secara bawaan diwarisi oleh publik, dan Anda akan mendapatkan implikasi yang sangat berbeda.
Assaf Lavie
104
Sebenarnya, perbedaan sebenarnya yang sulit antara structdan classadalah bahwa yang terakhir dapat digunakan sebagai pengganti typenameuntuk mendeklarasikan parameter templat, sedangkan yang pertama tidak bisa. :)
sbi
21
@ MrUniverse: Ini benar-benar salah. (Ada sekolah yang menggunakan ini untuk konvensi, tetapi tidak secara sintaksis ditegakkan.)
sbi
3
@sbi "perbedaan rumit nyata antara struct dan kelas" - Cute, tapi pertanyaannya adalah tentang perbedaan antara sebuah struct dan sebuah kelas, bukan tentang perbedaan di mana kata kunci dapat digunakan.
Jim Balter
161

Mengutip FAQ C ++ ,

[7.8] Apa perbedaan antara kata kunci struct dan kelas?

Anggota dan kelas dasar dari suatu struct adalah publik secara default, sementara di kelas, mereka default ke pribadi. Catatan: Anda harus membuat kelas basis Anda secara eksplisit publik, pribadi, atau dilindungi, daripada mengandalkan default.

Struct dan class dinyatakan setara secara fungsional.

OK, cukup bicara techno bersih yang melengking itu. Secara emosional, sebagian besar pengembang membuat perbedaan yang kuat antara kelas dan struct. Sebuah struct hanya terasa seperti tumpukan bit terbuka dengan sangat sedikit dalam cara enkapsulasi atau fungsionalitas. Kelas terasa seperti anggota masyarakat yang hidup dan bertanggung jawab dengan layanan cerdas, penghalang enkapsulasi yang kuat, dan antarmuka yang terdefinisi dengan baik. Karena itu konotasi yang sudah dimiliki kebanyakan orang, Anda mungkin harus menggunakan kata kunci struct jika Anda memiliki kelas yang memiliki sangat sedikit metode dan memiliki data publik (hal-hal seperti itu ada dalam sistem yang dirancang dengan baik!), Tetapi jika tidak, Anda mungkin harus menggunakan kelas tersebut kata kunci.

Robᵩ
sumber
123

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 structsehingga 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, classdiperkenalkan 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.

Jon Hanna
sumber
Mungkin juga perlu dicatat bahwa mungkin lebih mudah untuk membuat kelas dan struktur bekerja sama di bawah tenda, daripada membuatnya berbeda secara mendasar. Mungkin ada dalam retrospeksi ada manfaat untuk misalnya menetapkan bahwa apa pun yang dinyatakan sebagai struct harus menjadi PODS (yaitu melarang struct dari memiliki anggota virtual, konstruktor default non-sepele atau destruktor, dll) tetapi hal seperti itu belum sepengetahuan saya pernah diminta oleh standar C ++ atau implementasi.
supercat
1
@supercat fakta bahwa itu adalah bahasa OO di mana repertoar besar program yang ditulis dalam bahasa non-OO adalah program yang valid, membawa konsep ke depan, dan tampaknya muncul lebih banyak di sana daripada di bahasa OO lebih murni (dan tentu saja sebenarnya didefinisikan dalam standar). Sejarah awal C ++ jelas menjelaskan banyak tentang hal itu. "Desain dan Evolusi C ++" dari Stroustrup adalah bacaan yang menarik.
Jon Hanna
1
Saya melihat perang agama antara orang-orang yang merasa bahwa segala sesuatu yang tidak "oop-ish", harus, dan mereka yang berpikir OOP yang harus dianggap sebagai sebuah alat, tetapi tidak dengan alat. C ++ tampaknya merangkul filosofi terakhir, tetapi saya benar-benar tidak tahu banyak tentang bahasa sebelumnya. Filsafat saya sendiri adalah bahwa ketika seseorang menginginkan suatu objek, ia harus menggunakan suatu objek, dan ketika seseorang menginginkan agregasi variabel terkait tetapi independen, ia harus menggunakannya. C ++ tidak membuat perbedaan sintaksis antara hal-hal semacam itu, dan .NET mencoba untuk mengaburkan perbedaan itu, tetapi sedikit yang saya ketahui tentang D ...
supercat
1
... menunjukkan bahwa ia mengenalinya lebih dari C ++ atau .NET. Agregasi variabel tidak sepenuhnya OOPish, tetapi itu tidak berarti mereka tidak boleh digunakan ketika mereka berguna .
supercat
3
Saya tidak setuju dengan "C memiliki struct, tidak memiliki konsep enkapsulasi, jadi semuanya publik.", Anda dapat menyembunyikan definisi structdi dalam *.cfile -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 dalamnya struct.
12431234123412341234123
32

Anggota kelas bersifat pribadi secara default. Anggota Struct bersifat publik secara default. Selain itu tidak ada perbedaan lainnya. Lihat juga pertanyaan ini .

Kasprzol
sumber
15
Tidak hanya anggota, tetapi semua akses, termasuk warisan.
Nemanja Trifunovic
4
Yah, saya akan mengatakan perbedaan lainnya adalah semantik. Bangunan untuk banyak orang membuat mereka berpikir "struktur data" sebagai sisa dari C.
Kris Kumler
3
@KrisKumler: Itu bukan "semantik"; itu adalah perasaan pribadi. Keduanya structdan classmendeklarasikan kelas dengan semantik identik (meskipun interpretasi parse-bijaksana dari tubuh definisi).
Lightness Races dalam Orbit
28

Menurut Stroustrup dalam Bahasa Pemrograman C ++ :

Gaya mana yang Anda gunakan tergantung pada keadaan dan selera. Saya biasanya lebih suka menggunakan structuntuk kelas yang memiliki semua data publik. Saya memikirkan kelas-kelas seperti "tipe yang tidak tepat, hanya struktur data."

Secara fungsional, tidak ada perbedaan selain publik / pribadi

crashmstr
sumber
32
Perbedaan apa? Tolong jelaskan.
crashmstr
10

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.

64BitBob
sumber
1
Ini adalah hal yang paling tidak jelas tentang struct dan kelas. "Structs adalah tentang data, kelas adalah tentang kode" dapat diulangi sebagai "struct adalah tentang data, kelas adalah tentang data, keamanan dan operasi yang dilakukan pada data ini"
Arun Aravind
3
Tidak mungkin membuat struct di C ++. Dimungkinkan untuk membuat kelas menggunakan structkata kunci yang diwarisi .
Lightness Races dalam Orbit
1
Jawaban ini sepertinya bukan tentang C ++. Dalam C ++, structdeklarasikan kelas (termasuk public/ private/ protected, inheritance, dll).
melpomene
Bagaimana struct abstrak? Menulis struct mentah ke file penuh dengan masalah bahkan dalam C (masalah yang biasa termasuk padding, endianness, ukuran kata yang berbeda, dll). SIZEMakro apa ini yang sedang Anda bicarakan?
melpomene
10

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.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

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.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}
Suraj K Thomas
sumber
Saya telah menghapus contoh kode 3-7 seperti yang disebutkan oleh para ahli
Suraj K Thomas
8

Satu-satunya perbedaan lainnya adalah warisan bawaan kelas dan struct, yang, secara mengejutkan, bersifat privat dan publik.

Mendesis
sumber
5
  1. Anggota struktur bersifat publik secara default, anggota kelas bersifat pribadi secara default.
  2. Warisan default untuk Struktur dari struktur atau kelas lain adalah publik. Warisan default untuk kelas dari struktur atau kelas lain adalah pribadi.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

Ini pada VS2005.

melpomene
sumber
_tmainbukan standar C ++.
melpomene
4

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.

MSalters
sumber
4

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.

KPexEA
sumber
1
Kode yang menggunakan memfill untuk menghapus struct mungkin memiliki kebiasaan ofensif lainnya. Pergi dengan hati-hati.
David Thornley
@ Davidvidhorn: Penggunaan zero-fill untuk menghapus atau menginisialisasi struktur data adalah standar dalam C. Dalam proyek bahasa campuran, seseorang tidak dapat mengharapkan kode di bagian C untuk menghindari callocmendukung new. Yang dapat dilakukan adalah mencoba memastikan bahwa struktur apa pun yang digunakan oleh bagian C dari kode sebenarnya adalah PODS.
supercat
4
  1. Anggota kelas yang ditentukan dengan kata kunci classsecara privatedefault. Anggota kelas yang ditentukan dengan kata kunci struct(atau union) secara publicdefault.

  2. Dengan tidak adanya akses-specifier untuk kelas dasar, publicdiasumsikan ketika kelas turunan dideklarasikan structdan privatediasumsikan ketika kelas dideklarasikan class.

  3. Anda dapat mendeklarasikan enum classtetapi tidak enum struct.

  4. Anda bisa menggunakan template<class T>tetapi tidak template<struct T>.

Perhatikan juga bahwa standar C ++ memungkinkan Anda untuk meneruskan mendeklarasikan tipe sebagai struct, dan kemudian gunakan classsaat mendeklarasikan tipe dan sebaliknya. Juga, std::is_class<Y>::valueadalah trueuntuk Y menjadi structdan class, tetapi falseuntuk enum class.

Batsyeba
sumber
jawaban yang bagus, walaupun saya tidak jelas 0) perbedaan antara structdan classdalam c + + adalah perbedaan antara kata kunci, bukan antara tipe data (atau beberapa alternatif yang lebih baik;)
idclev 463035818
@ formerlyknownas_463035818: Tapi bukankah menurut Anda std::is_class<Y>::valuemencakup itu?
Batsyeba
ya, hanya berpikir itu bisa lebih menonjol, karena itulah kesalahpahaman yang umum dan sekali itu keluar dari jalan sisanya hanyalah konsekuensi wajar.
idclev 463035818
Nevermind, jawaban Anda sempurna apa adanya, saya menulis satu lagi, tidak ada salahnya untuk memiliki satu lagi
idclev 463035818
4

Perbedaan antara classdan structmerupakan perbedaan antara kata kunci, bukan antara tipe data. Dua ini

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

keduanya mendefinisikan tipe kelas. Perbedaan kata kunci dalam konteks ini adalah perbedaan akses standar:

  • foo::xbersifat publik dan foo_basediwarisi secara publik
  • bar::xbersifat pribadi dan bar_basediwarisi secara pribadi
idclev 463035818
sumber
2

Berikut ini penjelasan yang bagus: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Jadi, sekali lagi: di C ++, sebuah struct identik dengan kelas kecuali bahwa anggota struct memiliki visibilitas publik secara default, tetapi anggota kelas memiliki visibilitas pribadi secara default.

nutario
sumber
2

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.

menemukan
sumber
2

ISO IEC 14882-2003

9 Kelas

§3

Struktur adalah kelas yang didefinisikan dengan kunci-kelas struct ; anggotanya dan kelas dasarnya (klausa 10) adalah publik secara default (klausa 11).

Gregory Pakosz
sumber
2

Perbedaan utama lainnya adalah ketika datang ke Template. Sejauh yang saya tahu, Anda dapat menggunakan kelas ketika Anda mendefinisikan template tetapi BUKAN struct.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
Stefan Popescu
sumber
1
Jika Anda bermaksud menekankan bahwa struktur tidak dapat digunakan sebagai tipe umum, maka Anda salah. Dan structtidak diperbolehkan di sana hanya dengan konvensi (lebih baik katakan itu classkata kunci yang digunakan dalam arti berbeda di sini, lihat Menggunakan 'class' atau 'typename' untuk parameter template ).
dma_k
Kata kunci tidak diizinkan di sana, tetapi Anda dapat lulus di kelas yang Anda tentukan dengan structbaik. Coba saja. struct T{}; template <typename T> void foo() {} foo<T>();
Lightness Races in Orbit
1

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 classdan kemudian didefinisikan dengan struct(atau mungkin sebaliknya) ), meskipun standar mengatakan itu sangat legal.

ymett
sumber
Saya tahu ini adalah komentar yang sangat terlambat, tetapi perlu diingat bahwa peringatan tersebut bukan tanpa manfaat karena Windows ABI merusak struktur dan kelas secara berbeda dan karenanya mencampurkan (meneruskan) deklarasi kelas dan struct sebenarnya dapat menyebabkan sulit untuk memahami masalah penautan!
MFH
1
  • . Di kelas semua anggota secara default bersifat pribadi tetapi dalam struktur anggota adalah publik secara default.

    1. Tidak ada istilah seperti konstruktor dan destruktor untuk struct, tetapi untuk kompiler kelas membuat default jika Anda tidak menyediakan.

    2. 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.

yshivakathik
sumber
3
"2. Struktur sizeof kosong adalah 0 Bytes karena kelas Sizeof kosong adalah 1 Byte". Salah. Saya baru saja diuji dengan g++. Anda mungkin berpikir tentang Optimalisasi Basis Kosong, tetapi itu berlaku untuk keduanya juga.
cdunn2001
1
Tidak benar. Dalam C ++ ukuran struct kosong adalah 1. Dalam C struct kosong tidak diperbolehkan. GCC memungkinkan struct kosong dalam C sebagai ekstensi kompiler dan struct tersebut memiliki ukuran 0.
Johan Råde
Jawaban ini salah. Selain ukuran, bagian konstruktor / destruktor juga tidak akurat: struct dapat memiliki konstruktor dan destruktor dengan baik. Bahkan, structmembuat kelas penuh di C ++.
melpomene
1

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).

UKMonkey
sumber
-1

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 .

√ PERTIMBANGKAN mendefinisikan struct bukan kelas jika instance dari tipe kecil dan biasanya berumur pendek atau biasanya tertanam dalam objek lain.

X HINDARI mendefinisikan struct kecuali tipe tersebut memiliki semua karakteristik berikut:

Secara logis mewakili nilai tunggal, mirip dengan tipe primitif (int, dobel, dll.).

Ini memiliki ukuran instance di bawah 16 byte.

Itu tidak berubah.

Itu tidak harus sering kotak.

Kiriloff
sumber
Itu tentang .NET / C #, bukan C ++.
melpomene
-2

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.

salju
sumber
Jawaban ini sepertinya bukan tentang C ++. Di C ++, structdeklarasikan kelas (termasuk kontrol izin, pewarisan, dll).
melpomene
-3

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.

MOBITI MAHENGE
sumber
OP telah menyebutkan bahwa structanggota adalah publik secara default, dan jawaban yang diterima dari 2009 menyebutkan pewarisan. Mengapa menulis jawaban lain yang tidak menambahkan informasi baru 4 tahun kemudian?
melpomene
-3

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)

Wageesha
sumber
1
Bagaimana warisan pribadi "lebih realistis"? Sebagian besar bahasa pemrograman bahkan tidak memiliki konsep warisan pribadi.
melpomene
-3

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.

Tushar Bobade
sumber
Jawaban ini sepertinya bukan tentang C ++. Dalam C ++, structdeklarasikan kelas (termasuk public/ private/ protected, inheritance, dll).
melpomene
-3

** 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.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

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.

Eric Hill
sumber
1
Bagaimana Anda menentukan bahwa m_Foo.aitu diinisialisasi? Bagaimana jika itu tidak diinisialisasi dan kebetulan 0?
melpomene
Uhhh, tidak. Salahku. Ini bukan perbedaan antara struct dan kelas. Karakteristik inisialisasi adalah sama.
Eric Hill
-4

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!

Yug Rawal
sumber
1
Dalam C ++ structdapat memiliki fungsi anggota
chtz
@chtz Terima kasih ... saya harus tahu tentang fitur ini sekarang .. terima kasih banyak .. saya hanya seorang pemula yang tidak ahli seperti Anda sehingga di masa depan juga perlu saran dari kalian :-)
Yug Rawal
dan sebenarnya, fungsi anggota dimaksudkan dalam arti yang lebih luas. structdapat 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 bahasa
Gian Paolo
-5

Saya 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.

Ali
sumber
4
Ini tidak benar. Tidak ada perbedaan antara kelas yang ditentukan dengan structkata kunci dan kelas yang didefinisikan dengan classkata kunci dalam hal ini.
ymett
ketika saya menggunakan struct tanpa konstruktor, saya mendapatkan kecepatan yang lebih baik daripada kelas tanpa konstruktor.
Ali
@ Ali Tidak, kamu tidak.
Lightness Races dalam Orbit
-5

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:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

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).

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

Dalam program di atas, MyClass _myClassObject2 = _myClassObject1; instruksi menunjukkan bahwa kedua variabel tipe MyClass

  1. myClassObject1
  2. myClassObject2

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:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

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.

Abhishek Sharma
sumber
4
Saya pikir ini sedang mencoba menjawab pertanyaan untuk c #? Pertanyaannya adalah tentang c ++, dan itu membuat jawaban ini tidak akurat, bukan?
smw
@smw benar-benar, dia telah menulis kode sampel dalam C # dan saya datang ke sini untuk memeriksa bahwa tidak ada perbedaan dalam melewati parameter antara C ++ structdan class. Tidak ada seorang pun di sini yang menyebutkannya, atau seluruh web. Jadi saya tidak berpikir ini berlaku untuk C ++ juga.
John
Ini bahkan bukan kode C # yang valid - semua kata kunci salah. "Publik", "Static", "Int", dan "Class" tidak boleh menggunakan huruf besar dan harus "struct" bukan "Structure". Deskripsi sebagian besar akurat untuk C # (meskipun struct masih dapat mewarisi antarmuka, tidak hanya struct lainnya), tetapi tidak menjawab pertanyaan karena itu tentang C ++ ...
Darrel Hoffman
2
Jawaban ini benar-benar omong kosong. Ini menggunakan campuran aneh Visual Basic dan C # untuk contoh kode, dan keseluruhan "Kelas adalah tipe Referensi dan Struktur adalah tipe Nilai" ... hal hanya berlaku untuk .NET (yaitu C #) bukan untuk C ++. Anda berada di ruangan yang salah, bung. Di sinilah tempat Anda: stackoverflow.com/questions/13049
TheFlash
Tapi jawaban ini menunjukkan hal yang sama berlaku untuk C (++), bahwa struct digunakan seperti tipe nilai. int a = 3; int b = a;dan yang serupaMyStruct a=MyStruct("data"); MyStruct b = a;
luckydonald
-8

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

Naveen
sumber
2
Struktur C ++ mendukung metode pewarisan dan abstrak. Struktur dan kelas dialokasikan dengan cara yang sama. Mengalokasikan kelas di heap bahkan jika mereka tidak dipakai dengan "baru" tidak masuk akal untuk sistem embedded.
JCMS
2
# 1 juga salah. Stack digunakan ketika Anda mendeklarasikan sesuatu dari tipe itu sebagai variabel lokal, dan heap digunakan ketika Anda menggunakan operator "baru".
Score_Under