Anggota Kelas Tingkat Lanjut dan Relasi Antar Kelas
Questions/Cues
Bagaimana cara kerja const member?
Apa itu anggota static?
Bagaimana inisialisasi anggota static?
Apa kegunaan friend?
Apa itu nested class?
Reference Points
Materi PDF: “Bahasa C++: Konsep Kelas (bagian II)”
Materi Pendukung: “Tutorial 1”
const Members: Atribut & Method
Keyword const digunakan untuk menegakkan immutability (ketidakberubahan).
Atribut const: Nilai atribut ini tidak dapat diubah setelah objek diciptakan. Pengisian nilainya wajib dilakukan melalui Constructor Initialization List, bukan di dalam body constructor.
class Foo {private: const int data; // Atribut constpublic: // Benar: Inisialisasi melalui initialization list Foo(int x): data(x) {} };
Method const: Method ini berjanji untuk tidak mengubah state atau nilai dari data member objek. Objek yang dideklarasikan sebagai const hanya bisa memanggil method yang juga ditandai sebagai const.
Anggota static: Atribut & Method
Anggota static adalah anggota yang dimiliki oleh kelas, bukan oleh masing-masing objek. Artinya, hanya ada satu salinan anggota statik yang dipakai bersama oleh seluruh objek dari kelas tersebut.
Atribut static: Dipakai bersama oleh semua instance. Contoh: sebuah counter untuk menghitung jumlah objek yang telah dibuat.
// Di dalam class Stack (Stack.h)static int n_stack; // Deklarasi atribut statik
Method static: Hanya dapat mengakses anggota static lainnya dan tidak memiliki pointer this. Dapat dipanggil langsung menggunakan nama kelas tanpa perlu membuat objek: Stack::getNumOfStack();.
Inisialisasi Anggota Statik
Inisialisasi atribut staticharus dilakukan di luar deklarasi kelas dan di luar method. Biasanya ini dilakukan di file implementasi (.cpp atau .cc) untuk menghindari error multiply defined name saat linking.
friend adalah mekanisme untuk memberikan hak akses kepada sebuah fungsi atau kelas lain untuk mengakses anggota non-public (private dan protected) dari suatu kelas.
Sifat: Bersifat satu arah. Jika kelas A adalah friend dari kelas B, A bisa mengakses member privateB, tetapi tidak sebaliknya.
Kapan Digunakan: Sebaiknya dihindari kecuali benar-benar diperlukan, misalnya untuk implementasi operator overloading tertentu yang harus berupa fungsi non-anggota.
class B { friend class A; // Kelas A kini bisa akses member private B friend void f(int, char*); // Fungsi f kini bisa akses member private B // ...};
Nested Class
Nested class adalah kelas yang dideklarasikan di dalam deklarasi kelas lain.
Tujuan: Biasanya digunakan untuk membuat kelas “pembantu” yang sangat erat kaitannya dengan kelas pemiliknya dan tidak dimaksudkan untuk digunakan dari luar. Ini adalah bentuk enkapsulasi yang kuat.
Visibilitas: Jika dideklarasikan di bagian private, nested class akan tersembunyi dari dunia luar, yang biasanya merupakan efek yang diinginkan.
class List {private: class ListElem { // Nested class ListElem // ... anggota ListElem }; // ... anggota private kelas Listpublic: // ... anggota public kelas List};
Summary
C++ menyediakan fitur tingkat lanjut untuk mengelola perilaku dan relasi kelas. const digunakan untuk menjamin immutability, static untuk membuat anggota tingkat kelas yang dibagi bersama, friend untuk memberikan hak akses khusus, dan nested class untuk enkapsulasi kelas pembantu.
Inisialisasi anggota const wajib melalui initialization list, sementara anggota static diinisialisasi secara global di file implementasi.
Additional Information (Optional)
friend sebagai “Code Smell”
Penggunaan friend yang berlebihan terkadang dianggap sebagai code smell (indikasi potensi masalah desain). Jika sebuah kelas memiliki terlalu banyak friend, ini bisa berarti kelas tersebut memiliki terlalu banyak tanggung jawab atau enkapsulasinya terlalu lemah. Namun, friend tetap merupakan alat yang sah dan tak tergantikan untuk kasus-kasus tertentu seperti implementasi operator<< untuk std::ostream.
static dan Singleton Pattern
Anggota static adalah dasar dari salah satu design pattern paling terkenal, yaitu Singleton. Pattern ini memastikan bahwa sebuah kelas hanya memiliki satu instance. Ini dicapai dengan membuat constructor private dan menyediakan sebuah method public static yang mengelola dan mengembalikan satu-satunya instance tersebut.
const-correctness
Menulis kode dengan menggunakan const secara tepat di mana pun memungkinkan (pada variabel, parameter, pointer, dan method) disebut sebagai const-correctness. Ini adalah praktik yang sangat baik karena membantu compiler melakukan optimisasi dan, yang lebih penting, menangkap kesalahan logika saat kompilasi, bukan saat runtime.