CodeBlanks Logo Icon CodeBlanks

Yapıcı overloading

Aynı sınıfta birden çok yapıcı tanımlamayı öğrenirsin.

Yapıcı overloading

Bir sınıfta birden fazla yapıcı metot tanımlanabilir; buna overloading (aşırı yükleme) denir. Her yapıcı farklı parametre listesine sahip olmalıdır. Derleyici, çağrıdaki parametrelere bakarak hangi yapıcının çalışacağını seçer.

Örnek: class Note { public: Note() { title = "Boş"; } Note(std::string t) { title = t; } std::string title; };. Note a; birinci, Note b("Ödev"); ikinci yapıcıyı çağırır. İki yapıcı da Note adını taşır ama parametreleri farklı olduğu için çakışmaz. Bu, nesneyi farklı biçimlerde başlatma esnekliği verir.

Çakışma ve belirsizlik

Overloading'de parametre listeleri net biçimde farklı olmalıdır. Aksi halde belirsizlik (ambiguity) oluşur ve derleyici hata verir. Örnek: Note(int) ve Note(double) tanımlıysa, Note n('A'); çağrısı hem int'e hem double'a dönüşebilir; derleyici seçemez.

Varsayılan parametreli yapıcılarla da dikkatli olmak gerekir. Note(int x = 0) tanımlıysa Note n; çağrısı bu yapıcıya gider. Aynı anda parametresiz Note() de tanımlıysa belirsizlik doğar. Varsayılan parametrelerle aşırı yüklemeyi aynı anda kullanmak karışıklığa yol açar.

Uygulama Note sınıfına iki aşırı yüklenmiş yapıcı ekle

Note sınıfını tanımla. public: altına std::string title; üye değişkeni, Note() { title = "Boş"; } ve Note(std::string t) { title = t; } yapıcı metotlarını ekle. main içinde iki örnek oluştur: biri parametresiz, diğeri "Ödev" parametreli. İkisinin de title'ını std::cout ile ayrı satırlarda yazdır.

Başlangıç kodu

main.cpp
#include <iostream>
#include <string>

// Note sınıfını tanımla

int main() {
    // İki Note örneği oluştur ve title'larını yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>
#include <string>

class Note {
public:
    std::string title;
    Note() {
        title = "Boş";
    }
    Note(std::string t) {
        title = t;
    }
};

int main() {
    Note a;
    Note b("Ödev");
    std::cout << a.title << std::endl << b.title;
    return 0;
}

Beklenen çıktı

Boş
Ödev

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Note sınıfında Note() ve Note(std::string) tanımlıysa Note b("Ödev"); hangisini çağırır?

main.cpp
Note() { title = "Boş"; }
Note(std::string t) { title = t; }
  • Note(std::string t) yapıcısını Doğru cevap
  • Note() yapıcısını
  • İkisini birden
  • Derleme hatası, hiçbiri seçilmez

Açıklama: Derleyici parametre türüne göre en uygun yapıcıyı seçer.

2 İkinci yapıcıyı çağır

Soru
Note note____;
Cevap
Note note("Ödev");

Açıklama: Note note("Ödev"); parametreli yapıcıyı çağırır.

3 Çağrıyı çağrılan yapıcıya eşle

Kavram Anlamı
Note a; Note()
Note b("Ödev"); Note(std::string)
Note c(7); Note(int)
Note d('A'); belirsizlik

Orta seviye bölümündeki tüm dersler