Apa Itu Class
Class adalah cetak biru untuk tipe buatanmu sendiri yang menggabungkan data (member variable) dan perilaku (member function) menjadi satu kesatuan. Kalau tipe bawaan seperti int dan double menggambarkan satu nilai, class memungkinkan kamu memodelkan satu konsep utuh, misalnya rekening bank, titik 2D, atau pemain, sebagai satu nilai yang bisa kamu teruskan ke mana-mana.
Kamu sebenarnya sudah memakai class tanpa mendefinisikannya: std::string dan container vector adalah class dari standard library. Memanggil name.length() atau v.push_back(3) berarti memanggil member function pada sebuah objek. Sekarang kamu akan membuat tipe sendiri dengan cara yang sama, lalu lanjut ke constructor untuk menginisialisasinya.
Mendefinisikan Class dan Membuat Objek
Definisi class mencantumkan member-nya di antara kurung kurawal dan diakhiri titik koma. Lupa menulis ; di akhir adalah salah satu error paling umum bagi pemula. Setiap objek yang kamu buat dari class itu mendapat salinan member variable-nya sendiri.
rex dan luna adalah dua objek yang terpisah. Mengubah rex.name tidak menyentuh luna.name, karena setiap objek menyimpan datanya sendiri. Kamu mengakses member dengan operator titik . pada objek (atau -> kalau kamu memegang pointer ke objek itu).
public vs private
Secara default, semua yang ada di dalam class bersifat private: hanya member function milik class itu sendiri yang bisa menyentuhnya. Label public: membuka member untuk kode dari luar. Pembagian inilah inti dari enkapsulasi: kamu membuka antarmuka yang aman dan menyembunyikan data internal supaya tidak bisa dibuat masuk ke keadaan yang tidak valid.
Karena count bersifat private, tidak ada pemanggil yang bisa menyelipkan nilai negatif atau nilai yang tidak masuk akal; mereka harus lewat increment(). const setelah daftar parameter value() berjanji bahwa fungsi itu tidak mengubah objek. Ini membuatmu bisa memanggilnya pada objek const dan sekaligus menunjukkan maksudmu kepada pembaca.
Deklarasi vs. Definisi Method
Untuk class kecil, mendefinisikan method secara inline (seperti di atas) tidak masalah. Untuk class yang lebih besar, umumnya method dideklarasikan di dalam class dan isinya didefinisikan di luar, dengan sintaks scope ClassName::method. Cara ini menjaga definisi class tetap mudah dibaca sebagai ringkasan antarmukanya.
Awalan Rectangle:: memberi tahu compiler class mana pemilik fungsi tersebut. Di dalam definisi seperti itu kamu tetap merujuk member dengan namanya saja (width, area()), karena compiler tahu member itu milik objek yang memanggil method tersebut.
Pointer this
Di dalam member function non-static mana pun, this adalah pointer ke objek yang memanggil fungsi itu. Biasanya kamu tidak membutuhkannya, karena nama member saja sudah merujuk ke objek saat ini. Pointer ini berguna saat sebuah parameter menutupi (shadow) sebuah member karena namanya sama, sehingga kamu harus membedakannya.
Tanpa this->, menulis x = x; di dalam setX akan mengisi parameter dengan dirinya sendiri dan membiarkan member-nya tidak berubah. Ini bug yang diam-diam. this->x membuatnya jelas. Banyak codebase menghindari masalah ini sepenuhnya dengan memberi nama parameter yang berbeda (misalnya setX(int newX)), tetapi kamu akan sangat sering melihat this-> di kode nyata.
Kesalahan Umum
Beberapa jebakan class berulang kali menjebak orang:
- Lupa titik koma penutup. Definisi class diakhiri dengan
};. Hilangkan;dan kamu mendapat banjir error membingungkan yang menunjuk ke apa pun yang ada setelah class, bukan ke class-nya. - Lupa menginisialisasi member. Member bawaan seperti
intdandoubletidak otomatis bernilai nol. Membaca member yang belum diinisialisasi adalah undefined behavior. Beri member nilai default (int count = 0;) atau inisialisasi di constructor. - Mengakses member private dari luar.
c.count = 5;pada member private adalah compile error, jadi lewat method public saja. Ini tandanya enkapsulasi bekerja sesuai rencana. - Mencampuradukkan class dengan objek.
Dog.bark();itu salah, karenaDogadalah tipenya. Kamu memanggil method pada objek:rex.bark();.
// Uninitialized member - reading 'age' is undefined behavior:
class Cat {
public:
int age; // no default value
};
Cat c;
std::cout << c.age; // garbage value, not 0
Berikutnya: Constructor
Mengisi setiap member secara manual setelah membuat objek, seperti rex.name = ...; rex.age = ...;, itu membosankan dan gampang terlupa. Persis seperti itulah member yang belum diinisialisasi muncul. Halaman berikutnya membahas constructor: fungsi khusus yang otomatis berjalan saat objek dibuat, sehingga kamu bisa menjamin setiap objek dimulai dalam keadaan valid dengan sintaks satu baris yang rapi, Dog rex("Rex", 4);.
Pertanyaan yang sering diajukan
Apa perbedaan class dan object di C++?
Class adalah cetak birunya: ia menjelaskan data (member variable) dan perilaku (member function) apa yang dimiliki sebuah tipe. Object adalah wujud konkret yang dibuat dari cetak biru itu. class Dog { ... }; mendefinisikan tipenya sekali; Dog rex; membuat sebuah Dog sungguhan yang bisa kamu pakai. Satu class bisa menghasilkan banyak objek yang saling terpisah.
Apa perbedaan class dan struct di C++?
Secara teknis hanya level akses default-nya: member sebuah class bersifat private secara default, sedangkan member sebuah struct bersifat public secara default. Keduanya bisa punya member function, constructor, dan pewarisan. Menurut konvensi, struct dipakai untuk kumpulan data sederhana dan class untuk tipe yang punya perilaku dan aturan yang perlu dilindungi.
Apa fungsi pointer this di class C++?
Di dalam member function, this adalah pointer ke objek yang memanggil fungsi tersebut. Pakai untuk membedakan parameter dari member (this->x = x;) atau untuk mengembalikan objek saat ini. Kamu jarang membutuhkannya untuk akses member biasa, karena menulis x sudah merujuk ke x milik objek saat ini.