Menu

Struct C++: mengelompokkan data terkait dalam satu tipe

Struct di C++ dijelaskan: cara menggabungkan variabel-variabel yang berkaitan menjadi satu tipe, mendeklarasikan dan menginisialisasi objek struct, memberi struct member function dan constructor, dan apa beda sebenarnya struct dengan class.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Kenapa mengelompokkan data

Sejauh ini setiap variabel berdiri sendiri: int di sini, string di sana. Tapi program sungguhan berurusan dengan sesuatu yang terdiri dari beberapa bagian: titik punya x dan y, siswa punya nama, umur, dan IPK. Mengirim semuanya sebagai variabel lepas yang terpisah itu rawan kesalahan. Tidak ada yang mengikat mereka, dan fungsi yang butuh ketiganya harus menerima tiga parameter.

Struct menyelesaikan masalah ini. Struct mendefinisikan tipe baru yang menggabungkan variabel-variabel yang berkaitan, yaitu member-nya, menjadi satu unit. Setelah didefinisikan, kamu memperlakukan seluruh kumpulan itu sebagai satu nilai yang bisa disimpan, disalin, dan dikirim ke fungsi.

Kamu mengakses setiap member dengan operator titik (s.name, s.age). Titik koma setelah } penutup definisi struct itu wajib. Melupakannya adalah salah satu error kompilasi paling umum di kalangan pemula C++.

Menginisialisasi struct

Mengisi setiap field secara manual memang bisa, tapi bertele-tele dan mudah ada member yang terlupa. Pilihan yang lebih rapi adalah aggregate initialization: tulis nilai-nilainya di dalam kurung kurawal, dengan urutan yang sama seperti saat member dideklarasikan.

Hati-hati dengan bentuk kosong: Point p; (tanpa kurung kurawal) membiarkan x dan y berisi nilai sampah, karena member bawaan tidak otomatis bernilai nol. Point p{}; menginisialisasinya menjadi 0. Pilih yang memakai kurung kurawal. Kamu juga bisa langsung menanamkan nilai default di definisinya, sehingga Point p; pun dimulai dengan bersih:

Struct sebagai parameter fungsi

Struct adalah satu nilai, jadi sebuah fungsi bisa menerima satu parameter alih-alih tiga. Ingat saja bahwa mengirim struct berdasarkan nilai akan menyalin setiap member. Untuk apa pun yang lebih besar dari beberapa int, kirim sebagai reference const supaya tidak ada penyalinan, aturan yang sama seperti yang kamu lihat di halaman reference.

Mengembalikan seluruh struct dari fungsi adalah cara yang lazim untuk menyerahkan beberapa nilai sekaligus, jauh lebih rapi daripada repot dengan banyak reference output.

Menambah member function dan constructor

Struct tidak terbatas pada data. Ia bisa berisi member function yang bekerja pada member-nya sendiri, dan constructor yang menginisialisasi objek saat objek itu dibuat. Di sinilah struct mulai terlihat seperti objek kecil yang punya perilaku.

Di dalam member function, member diakses lewat namanya (width, height), dan nama itu merujuk ke salinan milik objek ini. Menandai area() const memberi tahu compiler bahwa fungsi itu hanya membaca objek, sehingga kamu juga bisa memanggilnya pada nilai const Rectangle. Constructor adalah topik tersendiri, termasuk sintaks initializer list : width(w) itu, dan halaman constructor membahasnya secara mendalam.

Struct vs class: perbedaan sebenarnya

Mungkin kamu pernah mendengar bahwa "struct untuk data, class untuk objek". Itu kebiasaan, bukan aturan bahasa. Di C++, struct dan class hampir sama, dan satu-satunya perbedaan bawaannya adalah level akses default.

struct S {
    int x;        // public by default
};

class C {
    int x;        // private by default
};

Member struct bersifat public kecuali kamu menandainya lain; member class dimulai sebagai private. Hanya itu. Keduanya bisa punya constructor, member function, inheritance, dan semua hal lainnya. Kamu bahkan bisa menambahkan access specifier secara eksplisit pada struct untuk menyembunyikan member:

Kesimpulan praktisnya: pakai struct untuk kumpulan data transparan yang setiap field-nya memang boleh diakses bebas (Point, Color, catatan konfigurasi), dan pakai class saat kamu ingin melindungi status internal di balik antarmuka publik. Compiler memperlakukan keduanya sama; kata kuncinya hanya menunjukkan maksudmu.

Array dan vector berisi struct

Karena struct adalah tipe biasa, kamu bisa memasukkan banyak struct ke dalam array atau vector dan menelusurinya dengan loop seperti nilai lainnya.

Perhatikan kurung kurawal bersarangnya: setiap {"Keyboard", 49.99} melakukan aggregate initialization untuk satu Product, dan kurung kurawal terluar membangun vector-nya. Memakai const Product& di loop berbasis range menghindari penyalinan setiap struct di setiap iterasi. Kalau & dihapus, setiap elemen akan diduplikasi tanpa perlu.

Berikutnya: enum

Struct memungkinkan kamu membangun tipe dari beberapa nilai yang digabungkan. Bab berikutnya bergerak ke arah sebaliknya: enum mendefinisikan tipe yang bisa menyimpan tepat satu nilai dari sekumpulan kecil nilai bernama. Sempurna untuk hal-hal seperti Color::Red, Direction::North, atau status sebuah state machine. Kamu akan melihat bagaimana enum class memberimu konstanta yang mudah dibaca dan aman tipe, yang cocok dipadukan dengan struct dan class yang sekarang sedang kamu bangun.

Pertanyaan yang sering diajukan

Apa itu struct di C++?

struct adalah tipe buatan pengguna yang mengelompokkan beberapa variabel yang berkaitan (disebut member) di bawah satu nama. Alih-alih repot dengan variabel terpisah string name, int age, dan double gpa, kamu menggabungkannya menjadi satu tipe Student dan cukup mengirim satu objek itu ke mana-mana. Struct juga bisa berisi member function dan constructor: di C++ modern, struct adalah class lengkap yang member-nya public secara default.

Apa perbedaan struct dan class di C++?

Secara teknis hanya level akses default: member struct bersifat public kecuali kamu menentukan lain, sedangkan member class bersifat private secara default. Hal yang sama berlaku untuk inheritance. Selebihnya (constructor, member function, method, inheritance) bekerja sama persis. Menurut kebiasaan, programmer memakai struct untuk kumpulan data sederhana dan class untuk tipe yang punya aturan internal dan isi yang disembunyikan.

Bagaimana cara menginisialisasi struct di C++?

Cara paling sederhana adalah aggregate initialization dengan kurung kurawal sesuai urutan member: Point p{3, 4};. Kamu juga bisa mengisi setiap field secara manual dengan operator titik (p.x = 3;), memberi member nilai default di definisinya (int x = 0;), atau menulis constructor supaya struct menyiapkan dirinya sendiri. Inisialisasi dengan kurung kurawal lebih disarankan karena tidak akan diam-diam membiarkan field tidak terinisialisasi.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai