Konstanta dalam Kelas & Initialization List
Konstanta data anggota (const) wajib diinisialisasi saat objek dibuat. Di C++, itu dilakukan melalui constructor initialization list (bukan di badan konstruktor).
#include <iostream>
using namespace std;
class Fred {
const int size;
public:
Fred(int sz);
void print();
};
Fred::Fred(int sz): size(sz) { }
void Fred::print() { cout << size << endl; }
int main() {
Fred a(1), b(2), c(3);
a.print(), b.print(), c.print();
}
Penjelasan
const int size;adalah data anggota konstan → nilainya hanya bisa ditetapkan sekali, tepat saat konstruksi objek.Fred::Fred(int sz): size(sz) {}memakaimember-initializerlistuntuk mengisisize. Menaruhsize = sz;di badan konstruktor (kurung kurawal) tidak boleh untukconstmember—sudah terlambat karena objek telah terbangun.- Metode print() aman hanya membaca size.
Versi dengan default constructor
Kode berikut menambahkan ctor tanpa argumen dengan nilai baku untuk size.
#include <iostream>
using namespace std;
class Fred {
const int size;
public:
Fred( );
Fred( int sz );
void print( );
};
Fred::Fred( ): size(0) { }
Fred::Fred( int sz ): size( sz ) { }
void Fred::print( ) { cout << size << endl; }
int main( ) {
Fred a(1), b(2), c(3);
Fred d;
a.print(), b.print(), c.print();
}
Poin penting:
Fred(): size(0) {}memberi nilai default saat tidak ada argumen.Fred(int sz): size(sz) {}tetap menggunakaninitializer list.- Anda tidak bisa menunda pengisian
sizeke badan konstruktor.
Alternatif modern (C++11+): default member initializerclass Fred { const int size = 0; ... };Lalu konstruktor berparameter masih bisa menimpa viainitializer list: Fred(int sz):size(sz) {}.
Ukuran tetap di dalam kelas
Untuk membuat array anggota dengan ukuran konstan yang diketahui saat kompilasi, gunakan enum atau static const integral (atau constexpr).
class Bunch {
enum { size = 1000 };
int i [size];
};