Setelah kita memahami class sebagai cetak biru dan object sebagai wujud nyatanya, sekarang saatnya memformalkan cara menulisnya di C++. Mendefinisikan class terlihat sederhana — kata kunci class, nama, kurung kurawal — tetapi ada beberapa aturan yang wajib dipatuhi agar compiler mau menerima kode kita. Dua di antaranya paling sering membuat pemula tersandung: titik koma di akhir definisi dan cara menuliskan member function di luar badan class. Chapter ini membahas keduanya dengan contoh yang dijalankan langsung.

Sintaks Dasar class #

Definisi class di C++ mengikuti pola berikut: kata kunci class, diikuti nama class (konvensi umum memakai PascalCase seperti Kotak atau RekeningBank), lalu badan class di dalam kurung kurawal, dan diakhiri titik koma. Di dalam badan kita mendeklarasikan data member dan member function. Semua yang kita deklarasikan di sini menjadi bagian dari “bentuk” setiap object yang dibuat dari class ini.

cpp
class NamaClass {
    // data member dan member function ditulis di sini
};

Nama class adalah identifier, jadi aturannya sama dengan nama variable: boleh huruf, angka, dan garis bawah, tidak boleh diawali angka, dan bersifat case-sensitive. Karena class biasanya mewakili konsep, memilih kata benda sebagai namanya — Kotak, Produk, Pesanan — membuat kode langsung terbaca. Hindari nama umum seperti Data atau Objek1 yang tidak memberi informasi apa pun.

Titik Koma Wajib di Akhir Definisi #

Berbeda dengan badan fungsi, kurung kurawal penutup sebuah class harus ditutup titik koma. Alasannya: setelah kurung kurawal, kita boleh langsung mendeklarasikan variable bertipe class tersebut (misalnya class Kotak { ... } kotakKecil;), sehingga compiler menuntut pemisah pernyataan. Lupa titik koma adalah salah satu error paling klasik bagi pemula C++, dan pesannya tidak selalu terasa intuitif.

Bila kita menghapus titik koma tersebut, compiler g++ 14.2 memberikan pesan seperti ini:

text
semicolon.cpp:7:2: error: expected ';' after class definition
    7 | }
      |  ^
      |  ;

Pesan expected ';' after class definition langsung menyebut penyebabnya, jadi begitu melihat kata tersebut, periksa baris terakhir definisi class kita. Kebiasaan yang menyelamatkan: tuliskan }; secara berpasangan setiap kali membuka class Nama {. Error semacam ini terdeteksi pada saat kompilasi, bukan saat program berjalan, sehingga tidak pernah sampai merusak program jadi.

Member Function: di Dalam atau di Luar Class #

C++ memberi kita dua tempat untuk menuliskan implementasi member function. Cara pertama adalah mendefinisikannya langsung di dalam badan class — ringkas, dan menurut standar bahasa, fungsi semacam ini otomatis bersifat inline, artinya compiler boleh menyisipkan badan fungsinya langsung di titik pemanggilan demi kecepatan. Cara kedua adalah mendeklarasikan prototipe di dalam class, lalu menuliskan definisi lengkapnya di luar class dengan awalan NamaClass:: yang disebut scope operator.

Pemisahan ini bukan sekadar gaya. Untuk class pendek (lima sampai sepuluh baris), mendefinisikan semuanya di dalam class membuat kode mudah dibaca sekali jalan. Untuk class dengan fungsi panjang, memindahkan definisi ke luar membuat antarmuka class terlihat bersih: pembaca cukup memindai daftar fungsi tanpa terhambat detail implementasi. Kedua gaya boleh dicampur dalam satu class, dan itulah yang akan kita lakukan pada contoh berikut.

Contoh Lengkap: Class Kotak #

Program berikut memakai kedua gaya: hitungLuas() didefinisikan di dalam class, sedangkan cetakInfo() didefinisikan di luar class.

cpp
#include <iostream>

// Definisi class. Perhatikan titik koma WAJIB setelah kurung kurawal penutup.
class Kotak {
public:
    double panjang;
    double lebar;

    // Member function yang DIDEFINISIKAN di dalam class (otomatis inline)
    double hitungLuas() {
        return panjang * lebar;
    }

    // Hanya deklarasi; definisi lengkapnya ada di luar class
    void cetakInfo();
};

// Definisi member function di luar class, memakai scope operator ::
void Kotak::cetakInfo() {
    std::cout << "Kotak " << panjang << " x " << lebar
              << ", luas = " << hitungLuas() << "\n";
}

int main() {
    Kotak k;          // object dibuat di sini
    k.panjang = 4.0;
    k.lebar = 3.0;

    std::cout << k.hitungLuas() << "\n";
    k.cetakInfo();

    return 0;
}

Output yang Dihasilkan:

text
12
Kotak 4 x 3, luas = 12

Mari kita telaah bagian-bagian pentingnya:

  1. Baris 4-16 (class Kotak { ... };): definisi class ditutup titik koma. Kata public: pada baris 5 membuka area yang bisa diakses dari luar class; detailnya kita kupas di Chapter Access Specifiers.
  2. Baris 9-12 (double hitungLuas() { ... }): member function yang didefinisikan di dalam class. Ia boleh langsung memakai panjang dan lebar tanpa parameter tambahan, karena setiap object tahu data miliknya sendiri.
  3. Baris 15 (void cetakInfo();): ini hanya deklarasi (prototipe) — compiler diberi tahu bahwa fungsi bernama cetakInfo ada, tetapi badannya menyusul di bawah.
  4. Baris 19-23 (void Kotak::cetakInfo() { ... }): definisi di luar class. Awalan Kotak:: wajib; tanpa itu, compiler akan menganggap kita mendefinisikan fungsi biasa yang bukan member, lalu error karena fungsi tersebut memakai data member.
  5. Baris 26-28 (Kotak k; k.panjang = 4.0;): object dibuat dengan menuliskan tipe class lalu nama variable, persis seperti variable biasa. Member-nya diisi lewat operator ..

Perhatikan juga baris 23: fungsi cetakInfo() memanggil hitungLuas() tanpa awalan object. Di dalam member function, pemanggilan fungsi member lain otomatis dilakukan terhadap object yang sama — konsep this yang akan kita bahas tersendiri nanti.

Membuat dan Memakai Object #

Setelah class terdefinisi, tipe tersebut bisa dipakai seperti tipe lain: Kotak k; membuat object di stack, dan kita bisa membuat sebanyak mungkin object dari satu class dalam satu fungsi. Setiap object mendapat salinan data member sendiri, sehingga Kotak k2; k2.panjang = 10.0; tidak mengganggu k sedikit pun. Memanggil member function dilakukan dengan operator . setelah nama object, seperti k.hitungLuas() pada contoh di atas.

Kita sekarang sudah bisa mendefinisikan class dan memakainya. Masalahnya, pada contoh di atas semua member ditandai public: sehingga siapa pun boleh mengubah panjang dan lebar sembarangan — dan di sanalah access specifiers pada Chapter berikutnya berperan.

Rujukan resmi: Classes (cppreference) , Member functions (cppreference) .