Sampai Section ini, kita sudah bekerja dengan tipe dasar seperti int, double, dan std::string — satu variabel menyimpan satu nilai. Namun data di dunia nyata jarang berdiri sendiri: satu produk punya nama, stok, dan harga; satu mahasiswa punya NIM, nama, dan nilai. Menyimpan kelompok data seperti itu sebagai variabel-variabel terpisah memang bisa dilakukan, tetapi begitu data tersebut dikirim ke fungsi atau disalin ke tempat lain, kita harus mengangkut ketiganya satu per satu dan menjaga urutannya secara manual. C++ menyediakan struct untuk membungkus beberapa variabel terkait ke dalam satu tipe baru bernama. Pada Chapter ini kita mendefinisikan struct pertama, membuat variabelnya, dan mengakses tiap bagian lewat operator titik.
Mendefinisikan struct #
Definisi struct dimulai dengan kata kunci struct, diikuti nama tipe, lalu daftar member di dalam kurung kurawal dan titik koma penutup. Setiap member ditulis seperti deklarasi variabel biasa lengkap dengan tipenya. Definisi ini hanya membuat cetak biru (blueprint) — belum ada memori yang dialokasikan sampai kita mendeklarasikan variabel bertipe tersebut.
#include <iostream>
#include <string>
// Struct: cetak biru untuk mengelompokkan data produk toko
struct Produk {
std::string nama;
int stok;
double harga;
};
int main() {
Produk kopi; // deklarasi variabel bertipe struct
kopi.nama = "Kopi Arabika"; // akses member dengan operator titik
kopi.stok = 24;
kopi.harga = 55000.0;
Produk gula {"Gula Pasir", 40, 14000.0}; // inisialisasi (detail di chapter berikutnya)
std::cout << "Produk 1: " << kopi.nama << ", stok " << kopi.stok
<< ", Rp" << kopi.harga << "\n";
std::cout << "Produk 2: " << gula.nama << ", stok " << gula.stok
<< ", Rp" << gula.harga << "\n";
// Member bisa dibaca dan diubah seperti variabel biasa
kopi.stok = kopi.stok - 3;
std::cout << "Setelah jual 3 pak, stok kopi: " << kopi.stok << "\n";
return 0;
}Output yang Dihasilkan:
Produk 1: Kopi Arabika, stok 24, Rp55000
Produk 2: Gula Pasir, stok 40, Rp14000
Setelah jual 3 pak, stok kopi: 21Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 5-9 (
struct Produk { ... };): kita mendefinisikan tipe baru bernamaProdukdengan tiga member. Definisi struct selalu diakhiri titik koma setelah kurung kurawal penutup — melupakannya adalah salah satu error pertama yang paling sering ditemui pemula. - Baris 12 (
Produk kopi;): deklarasi variabelkopibertipeProduk. Memori untuk tiga member dialokasikan sekaligus sebagai satu kesatuan di stack. - Baris 13-15 (
kopi.nama = ...): operator titik (.) membuka akses ke member di dalam struct.kopi.namaadalahstd::stringutuh, sehingga kita bisa mengisinya seperti variabelstd::stringbiasa. - Baris 17 (
Produk gula {...}): variabel kedua langsung diinisialisasi dengan daftar nilai di dalam{}. Tiap nilai diisi berurutan sesuai urutan deklarasi member; pola ini kita perdalam pada Chapter Aggregate Initialization. - Baris 25-26: member diubah dan dibaca kembali persis seperti variabel biasa, hanya saja namanya harus diawali nama variabel struct-nya.
Mengapa struct Dibutuhkan #
Tanpa struct, data satu produk tersebar sebagai std::string namaKopi; int stokKopi; double hargaKopi; — dan produk kedua butuh tiga nama variabel lagi. Pola seperti itu membuat parameter fungsi membengkak: fungsi laporan stok membutuhkan enam parameter untuk dua produk, dan lupa urutan parameter stok versus harga tidak terdeteksi compiler karena tipenya sama-sama int dan double. Dengan struct, satu objek Produk membawa seluruh datanya ke mana pun dikirim, sehingga tanda tangan fungsi menjadi void cetakLaporan(const Produk& p) yang jauh lebih sulit salah pakai. Struct juga menjadikan aturan “data terkait bergerak bersama” menjadi jaminan compiler, bukan sekadar kesepakatan penamaan.
// Tanpa struct: rawan tertukar, compiler tidak bisa membantu
void terimaPengiriman(int stokBaru, double hargaBaru, std::string namaBaru);
// Dengan struct: satu kesatuan yang utuh
void terimaPengiriman(Produk produkBaru);Struct vs class: Sebuah Pratinjau #
Di C++, struct dan class nyaris identik — keduanya dapat punya member data, fungsi, dan constructor. Perbedaan tegasnya hanya satu: member struct secara default dapat diakses dari luar (public), sedangkan member class secara default tersembunyi (private). Untuk sekarang cukup pakai struct sebagai wadah data yang terbuka; perbedaan lengkapnya kita bedah pada Section Pemrograman Berorientasi Objek.
Referensi resmi untuk definisi struct dapat dibaca pada halaman class dan struct di cppreference. Selanjutnya kita masuk ke isi struct itu sendiri: aturan member variables, tipe apa saja yang boleh dijadikan member, dan bagaimana compiler menyusun memori untuknya.