Yapıcı Başlatma Listeleri
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 22 / 104.
Player(std::string n, int h) : name(n), health(h) {} gibi iki nokta üst üste sözdizimini önceki derslerde gördün. Buna üye başlatıcı listesi denir ve C++'ta üyeleri başlatmanın tercih edilen yoludur.
Başlatıcı listesi, yapıcının parametre listesinden sonra iki nokta üst üste işaretiyle başlar. Her üye, değerine doğrudan ve virgüllerle ayrılmış şekilde başlatılır:
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) {
// Kurucu gövdesi (boş olabilir)
}
};Oluşturucunun gövdesinde atama yapmak yerine neden başlatıcı listeleri kullanılır? Atama yapıldığında, üyeler önce varsayılan değerlerle oluşturulur, ardından yeni değerler atanır. Başlatıcı listeleri kullanıldığında üyeler doğrudan doğru değerlerle oluşturulur; bu daha verimlidir ve bazen gereklidir.
Bazı üyeler liste kullanılarak başlatılmalıdır:
constüyelerine yapıcı işleminden sonra değer atanamaz
- Referans üyeler - başlatma sırasında bağlanmalıdır
- Varsayılan kurucuları olmayan üyeler
class Player {
const int maxHealth; // Başlatıcı listesi kullanılmalı
std::string name;
public:
// Bu çalışır
Player(int max, std::string n) : maxHealth(max), name(n) {}
// Bu derlenmez:
// Player(int max) { maxHealth = max; } // Hata!
};Üyeler, başlatma listesindeki sıraya göre değil, sınıfta bildirildikleri sıraya göre başlatılır. Karışıklığı önlemek için başlatma listenizi her zaman bildirim sırasına göre yazın.
Görev
KolayÜye başlatıcı listelerinin ne zaman ve neden gerekli olduğunu gösteren bir oyun motoru yapılandırma sistemi oluşturalım. Başlatıcı liste sözdizimi kullanılarak başlatılması gereken üyeleri olan bir GameConfig sınıfı oluşturacaksın.
Kodunu düzenlemek için iki dosya oluşturacaksın:
GameConfig.h: Oyun ayarlarını saklayan birGameConfigsınıfı tanımla. Sınıfında şunlar bulunmalı:- Bir
const std::string gameName: oluşturulduktan sonra değiştirilemeyen oyunun başlığı - Bir
const int maxPlayers: oluşturulurken sabitlenen maksimum oyuncu sayısı - Bir
int& difficultyRef: harici bir zorluk ayarına başvuru - Ekran ayarları için sıradan üyeler olan bir
int screenWidthve birint screenHeight - Gerekli tüm parametreleri alan ve her üyeyi başlatıcı listeyi kullanarak başlatan bir kurucu. Başlatıcı liste, sınıfta üyelerin tanımlandığı sırayı izlemeli
- Yapılandırmayı şu biçimde yazdıran bir
display()yöntemi:Game: <gameName> Max Players: <maxPlayers> Difficulty: <difficultyRef value> Resolution: <screenWidth>x<screenHeight>
- Bir
main.cpp: Yapılandırma değerlerini girdiden oku ve bir GameConfig nesnesi oluştur. Şunları yapman gerekecek:- Oyun adını (string), maksimum oyuncu sayısını (int), zorluk seviyesini (int), genişliği (int) ve yüksekliği (int) girdiden oku: her biri ayrı bir satırda olmalı
- Yapılandırmanın başvuracağı zorluk seviyesi için yerel bir
intdeğişkeni oluştur - Başlatıcı liste kurucusunu kullanarak bir
GameConfignesnesi oluştur - İlk yapılandırmayı göstermek için
display()yöntemini çağır - Zorluk seviyesi değişkenini doğrudan değiştir (değerini 2 ile çarp)
"After difficulty change:"yazdır- Başvurunun güncellenmiş değeri yansıttığını göstermek için
display()yöntemini yeniden çağır
Bu alıştırma, başlatıcı listelerin neden önemli olduğunu vurgular: const üyelerin ve başvuru üyen kurucu gövdesinde atanamaz. Bunlar listede başlatılmalıdır. Başvuru üyesi ayrıca, özgün değişkendeki değişikliklerin yapılandırma nesnesi üzerinden nasıl yansıtıldığını da gösterir.
Başlık dosyanı main.cpp dosyasına #include "GameConfig.h" kullanarak ekle.
Kendin dene
#include <iostream>
#include <string>
#include "GameConfig.h"
using namespace std;
int main() {
// Giriş değerlerini oku
string gameName;
getline(cin, gameName);
int maxPlayers;
cin >> maxPlayers;
int difficulty;
cin >> difficulty;
int width;
cin >> width;
int height;
cin >> height;
// TODO: Başlatıcı listesi yapıcısını kullanarak bir GameConfig nesnesi oluştur
// Yapıcı şu değerleri almalı: gameName, maxPlayers, difficulty (referans yoluyla), width, height
// TODO: Başlangıç yapılandırmasını göstermek için display() fonksiyonunu çağır
// TODO: difficulty değişkenini doğrudan değiştir (2 ile çarp)
// TODO: "After difficulty change:" yazdır
// TODO: Güncellenmiş yapılandırmayı göstermek için display() fonksiyonunu tekrar çağır
return 0;
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarC++ Derleme ve Derleme SüreciHeader Dosyaları ve Kaynak DosyalarıNamespace'ler ve KapsamC++'ta Nesne Yönelimli Programlamaya GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriTekrar - Basit Hesap Makinesi4Sınıf Özellikleri
Nesne ve Statik ÜyelerGetter ve Setter'larconst Üye Fonksiyonlarımutable Anahtar SözcüğüStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim DüzeyleriCtor ve Dtor Çağrı SırasıMetot Geçersiz KılmaVirtual Fonksiyonlar ve VTableÇoklu KalıtımVirtual KalıtımÖzet - Çalışan Hiyerarşisi2Bellek Yönetimi
Stack ve Heap Belleğiİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++’ta Akıllı İşaretçilerC++’ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'ta Erişim BelirleyicileriErişim Belirleyicilerine Derinlemesine BakışBilgi GizlemeStruct ve Class Karşılaştırmasıİç İçe ve İç SınıflarTekrar - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme Zamanı ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDinamik Tür Dönüştürme ve RTTITekrar - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Bileşim ve KalıtımCRTP ile Mixin'lerPimpl İdiomuTür SilmeEnum Sınıfları ve Güçlü TürlemeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopyalama YapıcısıTaşıma YapıcısıYapıcı Başlatma ListeleriYönlendiren YapıcılarYıkıcıları Derinlemesine İncelemeÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatörleri Aşırı YüklemeKarşılaştırma Operatörlerini Aşırı YüklemeAkış OperatörleriAtama Operatörünü Aşırı Yükleme[] ve () Operatörlerini Aşırı YüklemeTür Dönüşüm OperatörleriTekrar - Matrix Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeDeğişken Sayıda Argüman Alan ŞablonlarSFINAE ve Tür Özelliklerinin TemelleriTekrar: Genel Amaçlı KapsayıcıKendi başına pratik yap: Online C++ derleyicisi