Pemrograman berorientasi objek (object-oriented programming, OOP) adalah cara menyusun program dengan mengelompokkan data dan fungsi yang berhubungan ke dalam satu wadah bernama class. Dari satu class kita bisa membuat banyak object, yaitu instans nyata yang masing-masing menyimpan data sendiri. Pendekatan ini membuat program besar lebih mudah dibaca, diuji, dan dikembangkan karena kode disusun mengikuti “benda” yang sedang kita modelkan. Pada Chapter ini kita membangun intuisi class dan object lewat analogi sehari-hari, lalu menulis class pertama kita yang benar-benar dijalankan.
Class adalah Cetak Biru, Object adalah Wujud Nyata #
Class berperan seperti cetak biru (blueprint) arsitektur: ia mendeskripsikan bentuk dan kemampuan, tetapi bukan bangunan itu sendiri. Object adalah bangunan yang sudah berdiri — wujud nyata yang dibuat dari cetak biru dan menempati memori. Dari satu cetak biru kita boleh membuat sebanyak apa pun object yang kita butuhkan, dan setiap object hidup secara independen. Mengubah data pada satu object tidak akan memengaruhi object lain yang dibuat dari class yang sama.
Diagram berikut merangkum isi sebuah class Mobil: dua data member dan tiga member function. Gambar ini hanya mendeskripsikan cetak birunya; object mobilA dan mobilB akan dibuat dari class ini pada contoh di akhir Chapter.
State dan Behavior #
Setiap object membawa dua hal: state dan behavior. State adalah data yang dimiliki object pada suatu saat — untuk object mobil, contohnya merek dan kecepatan saat ini. Behavior adalah kemampuan yang bisa dilakukan object — menambah kecepatan, mengerem, atau melaporkan statusnya. Dalam C++, state disimpan oleh data member (variable di dalam class) dan behavior diwujudkan oleh member function (fungsi di dalam class).
Perlu dibedakan: state bersifat per object, sedangkan behavior bersifat milik class. Kita menulis fungsi rem() satu kali di dalam class, tetapi setiap object memakainya terhadap data miliknya sendiri. Inilah alasan dua mobil yang berasal dari class yang sama bisa berada pada kecepatan berbeda pada saat yang bersamaan.
Analogi Rekening Bank dan Kendaraan #
Analogi rekening bank sangat cocok untuk menggambarkan relasi class dan object. Class RekeningBank mendefinisikan data pemilik dan saldo, plus behavior setor() dan tarik(). Ketika bank membuka satu juta rekening, setiap rekening adalah object dengan saldo masing-masing, sementara aturan penarikan hanya ditulis satu kali di dalam class. Satu perubahan aturan di class otomatis berlaku untuk semua object.
Analogi kendaraan juga membantu. Class Mobil bisa punya banyak instans — mobil Budi, mobil Siti, mobil Dewi — dengan merek dan kecepatan berbeda-beda. Sebaliknya, behavior seperti rem() sama logikanya untuk semua mobil. Tabel berikut memetakan analogi ke istilah OOP:
| Dunia nyata | Istilah OOP | Dalam C++ |
|---|---|---|
| Cetak biru / rancangan mobil | Class | class Mobil { ... } |
| Mobil Budi, mobil Siti | Object (instans) | Mobil mobilA; |
| Kecepatan saat ini | State | data member kecepatan |
| Kemampuan mengerem | Behavior | member function rem() |
Mengapa Kita Memakai OOP #
Tanpa OOP, program prosedural cenderung menumpuk data dan fungsi secara terpisah: array kecepatanMobil di satu tempat, fungsi tambahKecepatan() di tempat lain, dan fungsi tersebut menerima parameter yang panjangnya bertambah seiring kebutuhan. Ketika program membesar, kita harus mengingat data mana yang berpasangan dengan fungsi mana — dan di sinilah kesalahan mudah terjadi. OOP menyelesaikan masalah ini dengan menaruh data dan fungsi yang berhubungan ke dalam satu unit sehingga hubungannya eksplisit.
Keuntungan lainnya adalah organisasi dan pemeliharaan. Kode tersusun berdasarkan konsep domain (rekening, mobil, produk) sehingga mudah dicari, dan perubahan pada satu class tidak merambat ke class lain bila antarmukanya tetap. OOP juga menjadi fondasi fitur lanjutan seperti constructor, destructor, dan nanti inheritance yang kita bahas pada chapter-chapter berikutnya di Section ini. Karena itu, menguasai pasangan class-object adalah langkah paling penting dalam perjalanan C++ kita.
Class Pertama: Dua Object dari Satu Cetak Biru #
Sekarang kita tulis class Mobil lengkap dengan state dan behavior, lalu membuat dua object darinya:
#include <iostream>
#include <string>
// Class = cetak biru. Object = instans nyata yang dibuat dari cetak biru ini.
class Mobil {
public:
std::string merek; // state: data yang dimiliki setiap object
int kecepatan; // state: data yang dimiliki setiap object
void tambahKecepatan(int tambahan) { // behavior: perilaku object
kecepatan += tambahan;
}
void rem() {
kecepatan = 0;
}
void cetakStatus() {
std::cout << merek << ": " << kecepatan << " km/jam\n";
}
};
int main() {
Mobil mobilA; // object pertama
Mobil mobilB; // object kedua: state-nya sepenuhnya independen
mobilA.merek = "Avanza";
mobilA.kecepatan = 40;
mobilB.merek = "Brio";
mobilB.kecepatan = 70;
mobilA.tambahKecepatan(20);
mobilB.rem();
mobilA.cetakStatus();
mobilB.cetakStatus();
return 0;
}Output yang Dihasilkan:
Avanza: 60 km/jam
Brio: 0 km/jamMari kita bedah baris demi baris:
- Baris 5 (
class Mobil {): kita mendefinisikan class baru bernamaMobil. Seluruh isi di antara kurung kurawal adalah anggota class (member). - Baris 7-8 (
std::string merek; int kecepatan;): dua data member yang membentuk state. Setiap objectMobilnantinya mendapat salinan sendiri untuk kedua data ini. - Baris 10-12 (
void tambahKecepatan(...)): member function pertama. Kata kuncivoidberarti fungsi tidak mengembalikan nilai; ia hanya mengubah state object pemanggil. - Baris 21-22 (
Mobil mobilA; Mobil mobilB;): di sinilah dua object dibuat. Compiler mengalokasikan memori untuk masing-masing berisi salinanmerekdankecepatansendiri. - Baris 29-30 (
mobilA.tambahKecepatan(20); mobilB.rem();): kita memanggil behavior lewat operator.. Fungsi yang sama dieksekusi terhadap data object yang berbeda:mobilAnaik ke 60, sedangkanmobilBturun ke 0.
Output membuktikan inti dari OOP: mobilA dan mobilB berasal dari cetak biru yang sama, tetapi state keduanya sepenuhnya terpisah. Memanggil rem() pada mobilB tidak menyentuh kecepatan mobilA sedikit pun.
Pada Chapter berikutnya kita memformalkan cara menulis class di C++: sintaks definisi, aturan titik koma, dan pilihan menulis member function di dalam atau di luar badan class.
Rujukan resmi: Classes (cppreference) .