Menu
CoddyTech

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 const tidak 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.

challenge icon

Tantangan

Mudah

Mari 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 class GameConfig yang menyimpan pengaturan game. Class-mu harus memiliki:
    • const std::string gameName: judul game, yang tidak dapat diubah setelah dibuat
    • const int maxPlayers: jumlah maksimum pemain, ditetapkan saat konstruksi
    • int& difficultyRef: referensi ke pengaturan tingkat kesulitan eksternal
    • int screenWidth dan int 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 int untuk tingkat kesulitan yang akan dirujuk oleh config
    • Membuat object GameConfig menggunakan 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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online