it-swarm-id.com

Apa perbedaan antara struct dan kelas di C ++?

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 bisa ditemukan di sudut yang tidak jelas dari spesifikasi C++.

414
palm3D

Anda lupa perbedaan 2 yang rumit antara kelas dan struct.

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

Dengan tidak adanya access-specifier untuk kelas dasar, publik diasumsikan ketika kelas turunan dinyatakan struct dan privat diasumsikan ketika kelas dideklarasikan kelas .

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

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

Perbedaan tambahan: kata kunci class dapat digunakan untuk mendeklarasikan parameter templat, sedangkan kata kunci struct tidak dapat digunakan.

449
Assaf Lavie

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 secara fungsional setara.

OK, cukup bicara techno bersih yang melengking. 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 adalah 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.

157
Robᵩ

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 sebagai ide buruk ketika mengambil pendekatan berorientasi objek, jadi dalam membuat bentuk C yang secara kondusif bagi OOP (Anda dapat melakukan OO dalam C , tetapi itu tidak akan membantu Anda) yang merupakan ide dalam C++ (awalnya "C With Classes"), 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 (tidak lagi sering benar dengan 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 yang membaca kode seperti untuk menginstruksikan mesin (atau kita akan tetap dengan Majelis dan mentah VM opcodes) itu ide yang baik untuk tetap dengan itu.

115
Jon Hanna

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

31
Kasprzol

Menurut Stroustrup di Bahasa Pemrograman C++ :

Gaya mana yang Anda gunakan tergantung pada keadaan dan selera. Saya biasanya lebih suka menggunakan struct untuk 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

28
crashmstr

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 kata demi kata. (mis. Dapatkan pointer ke struct, gunakan makro SIZE untuk menghitung jumlah byte yang akan disalin, lalu 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 mirip sekali dengan kelas dan kelas yang mirip sekali 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 biasanya mengikuti pola _ (). misalnya 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 dengan lebih baik dan meningkatkan penggunaan kembali kode Secara teori, setidaknya.

9
64BitBob

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, akses-specifier default untuk kelas dasar/struct adalah publik. Dan ketika menurunkan kelas, specifier akses default adalah 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;
}
9
Suraj K Thomas

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

8
Skizz
  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.

4
GirishNayak

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 memecah kode lawas 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.

4
KPexEA

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

4
MSalters

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
3
Stefan Popescu

Itu hanya sebuah konvensi. Structs dapat dibuat untuk menyimpan data sederhana tetapi kemudian berkembang waktu dengan penambahan fungsi dan konstruktor anggota. Di sisi lain, tidak biasa melihat selain publik: akses dalam sebuah struct.

2
finnw

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

2
Gregory Pakosz
  1. Anggota kelas yang didefinisikan dengan kata kunci class adalah private secara default. Anggota kelas yang didefinisikan dengan kata kunci struct (atau union) adalah public secara default.

  2. Dengan tidak adanya akses-specifier untuk kelas dasar, public diasumsikan ketika kelas diturunkan dideklarasikan struct dan private diasumsikan ketika kelas dinyatakan class.

  3. Anda dapat mendeklarasikan enum class tetapi bukan enum struct.

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

Perhatikan juga bahwa standar C++ memungkinkan Anda untuk meneruskan mendeklarasikan tipe sebagai struct, dan kemudian menggunakan class saat mendeklarasikan tipe dan sebaliknya. Juga, std::is_class<Y>::value adalah true untuk Y menjadi struct dan class, tetapi false untuk enum class.

2
Bathsheba

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.

2
nutario
  • . Di kelas-kelas semua anggota secara default bersifat pribadi tetapi dalam struktur anggota bersifat 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 Tipe 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 memerlukan 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 (instance dari kelas) dapat dilewatkan dengan referensi dan struktur dapat dilewati oleh nilai. Catatan: Ada komentar yang terkait dengan pertanyaan ini. Lihat halaman diskusi untuk menambah percakapan.

1
yshivakathik

Meskipun tersirat oleh jawaban lain, itu tidak disebutkan secara eksplisit - bahwa struct kompatibel dengan C, 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).

1
UKMonkey

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

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 dengan struct (atau mungkin yang lain bulat), meskipun standar mengatakan itu sangat legal.

1
ymett