Daftar Inisialisasi Konstruktor
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 22 dari 104.
Kamu sudah melihat sintaks titik dua di pelajaran sebelumnya seperti Player(std::string n, int h) : name(n), health(h) {}. Ini disebut daftar inisialisasi member, dan ini adalah cara yang lebih disarankan untuk menginisialisasi member di C++.
Daftar inisialisasi muncul setelah daftar parameter konstruktor, diawali dengan titik dua. Setiap anggota diinisialisasi langsung dengan nilainya, dipisahkan dengan koma:
class Rectangle {
int width;
int height;
const int id;
int& reference;
public:
Rectangle(int w, int h, int i, int& r)
: width(w), height(h), id(i), reference(r) {
// Isi konstruktor (boleh kosong)
}
};Mengapa menggunakan daftar inisialisasi alih-alih penugasan di dalam isi constructor? Dengan penugasan, anggota terlebih dahulu dibuat dengan nilai default, lalu diberi nilai baru. Dengan daftar inisialisasi, anggota langsung dibuat dengan nilai yang benar, lebih efisien dan terkadang diperlukan.
Anggota tertentu wajib diinisialisasi menggunakan list:
- member
consttidak dapat diberi nilai setelah konstruksi
- Member reference, harus diikat saat inisialisasi
- Anggota tanpa konstruktor default
class Player {
const int maxHealth; // Harus menggunakan initializer list
std::string name;
public:
// Ini berfungsi
Player(int max, std::string n) : maxHealth(max), name(n) {}
// Ini TIDAK akan bisa di-compile:
// Player(int max) { maxHealth = max; } // Error!
};Member diinisialisasi sesuai urutan dideklarasikan dalam class, bukan urutan dalam daftar inisialisasi. Selalu tulis daftar inisialisasimu sesuai urutan deklarasi agar tidak bingung.
Tantangan
MudahMari kita buat sistem konfigurasi untuk game engine yang menunjukkan kapan dan mengapa daftar penginisialisasi anggota penting. Kamu akan membuat class GameConfig dengan anggota yang wajib diinisialisasi menggunakan sintaks daftar penginisialisasi.
Kamu akan membuat dua file untuk menata kodemu:
GameConfig.h: Definisikan classGameConfigyang menyimpan pengaturan game. Class-mu harus memiliki:const std::string gameName: judul game, yang tidak dapat diubah setelah dibuatconst int maxPlayers: jumlah maksimum pemain, ditetapkan saat konstruksiint& difficultyRef: referensi ke pengaturan tingkat kesulitan eksternalint screenWidthdanint screenHeight: anggota biasa untuk pengaturan tampilan- Konstruktor yang menerima semua parameter yang diperlukan dan menginisialisasi SETIAP anggota menggunakan daftar penginisialisasi. Daftar penginisialisasi harus mengikuti urutan deklarasi anggota di dalam class
- method
display()yang mencetak konfigurasi dalam format ini:Game: <gameName> Max Players: <maxPlayers> Difficulty: <difficultyRef value> Resolution: <screenWidth>x<screenHeight>
main.cpp: Baca nilai konfigurasi dari input dan buat object GameConfig. Kamu perlu:- Membaca nama game (string), jumlah maksimum pemain (int), tingkat kesulitan (int), lebar (int), dan tinggi (int) dari input: masing-masing pada baris terpisah
- Membuat variabel lokal bertipe
intuntuk tingkat kesulitan yang akan dirujuk oleh config - Membuat object
GameConfigmenggunakan konstruktor daftar penginisialisasi - Memanggil
display()untuk menampilkan konfigurasi awal - Mengubah variabel tingkat kesulitan secara langsung (kalikan dengan 2)
- Mencetak
"After difficulty change:" - Memanggil
display()lagi untuk menunjukkan bahwa referensi mencerminkan nilai yang telah diperbarui
Tantangan ini menyoroti pentingnya daftar penginisialisasi: anggota const dan anggota referensimu tidak dapat diberi nilai di dalam badan konstruktor. Keduanya harus diinisialisasi di dalam daftar. Anggota referensi juga menunjukkan bagaimana perubahan pada variabel asli tercermin melalui object config.
Sertakan file header-mu di main.cpp menggunakan #include "GameConfig.h".
Coba sendiri
#include <iostream>
#include <string>
#include "GameConfig.h"
using namespace std;
int main() {
// Baca nilai input
string gameName;
getline(cin, gameName);
int maxPlayers;
cin >> maxPlayers;
int difficulty;
cin >> difficulty;
int width;
cin >> width;
int height;
cin >> height;
// TODO: Buat object GameConfig menggunakan konstruktor initializer list
// Konstruktor harus menerima: gameName, maxPlayers, difficulty (melalui referensi), width, height
// TODO: Panggil display() untuk menampilkan konfigurasi awal
// TODO: Ubah variabel difficulty secara langsung (kalikan nilainya dengan 2)
// TODO: Cetak "After difficulty change:"
// TODO: Panggil display() lagi untuk menampilkan konfigurasi yang telah diperbarui
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online