string sınıfının kurucu işlevleri

Bir string nesnesini hayata başlatmak için çok sayıda seçeneğimiz var. Bu yazımızda string sınıfının tüm kurucu işlevlerini, C++11 ile gelen yüklemeler de (overloads) dahil olmak üzere, ayrıntılı olarak inceleyeceğiz. Varsayılan kurucu işlev ile başlıyoruz:

Bu kurucu işlev string nesnemizi uzunluğu 0 olan bir yazıyla yani bir boş yazıyla başlatıyor. Bir boş yazı da geçerli bir yazıdır unutmayalım:

İkinci kurucu işlevimiz string nesnemizi bir cstring ile başlatıyor. Yani sonunda null karakter (‘\0’) olan bir yazıyla:

Aman dikkat, bu kurucu işleve gelen adresteki yazının sonunda sonlandırıcı karakterin (null character) olmaması ya da gelen adresin nullptr olması çalışma zamanı hatası oluşturur.

Hemen belirtelim, string sınıfının hiçbir kurucu işlevi explicit değil. Örneğin cstring parametreli kurucu işlev explicit olsaydı  yukarıdaki kodda s3 nesnesinin tanımı geçersiz olurdu. explicit olmayan cstring parametreli kurucu işlevimiz aynı zamanda tür dönüştürme görevini de üstlenmiş oluyor. string gereken yerlerde doğrudan bir cstring kullanabiliyoruz.

cstring parametreli kurucu işlevi buffer parametreli kurucu işlevle karıştırmamak gerekiyor:

Bu kurucu işlev, kendisine gelen adresten başlayarak n karakteri kullanıyor. Sonlandırıcı  karakterin özel bir önemi yok. Yani n karakterden herhangi biri sonlandırıcı karakter ise bu karakter de hayata gelen string nesnemizin tuttuğu yazıya dahil oluyor:

Sırada kopyalayan kurucu işlevimiz (copy constructor) var:

Açıklamaya gerek yok değil mi? string nesnemizi bir başka string nesnesinin tuttuğu yazıyı kopyalayarak hayata başlatıyoruz:

Yukarıdaki kodda s2, s3, s4 isimli string nesnelerimiz kopyalayan kurucu işlev ile hayata başladılar.

C++11’in  getirdiği nimetlerden biri taşıma semantiği. Artık string sınıfının taşıyan kurucu işlevi  de (move constructor)  var.

Hata nesnesi göndermeme güvencesini taşıyan bu kurucu  işlevimiz ile string değişkenimizi hayata veda edecek bir başka string nesnesinin kaynağını çalarak ya da artık gözden çıkarttığımız bir string nesnesinin kaynağını devralarak oluşturabiliyoruz:

main işlevinde tanımlanan s1 ve s2 string nesnelerine sağ taraf değerleri ile ilk değer verildiğinden bu nesneler taşıyan kurucu işlev ile hayata getirilmiş oluyorlar.

string değişkeninizi bir string parçası (substring) ile oluşturmaya ne dersiniz?

Kurucu işlevimiz, birinci parametre değişkenine gelen stringin idx indisli karakterinden başlayan n karakterlik parçasıyla string nesnemizi oluşturuyor. İşlevin üçüncü ve son parametresinin varsayılan arguman olarak string sınıfının const static veri öğesi npos‘u aldığını görüyorsunuz. Böylece bu parametreye bir değer geçilmediğinde işleve gönderilmiş olan npos değeri, idx indisinden başlayarak geriye kalan tüm karakterleri kullanıyor olacak:
Bu kurucu işlevde işlevin ikinci parametresine birinci parametreye gönderilen yazının uzunluğundan daha büyük bir değer geçilmesi durumunda standart kütüphanenin std::out_of_range sınıfı türünden bir hata nesnesi (exception) gönderilir. Aşağıdaki kodu derleyip bir çalıştırın bakalım:
Sırada dolduran (fill) kurucu işlevimiz var:
Bir string nesnesini dilediğimiz sayıda dilediğimiz karakterle başlatabiliriz:
Ne yazık ki sevgili  string sınıfının tek bir karakterle stringimizi başlatan bir kurucu işlevi yok. Bir string nesnesine tek bir karakteri atayabiliyoruz ama bir string nesnesini tek bir karakterle hayata başlatamıyoruz. Demokrasilerde çoğu zaman çareler tükenmez:
string sınıfının aynı zamanda sırasal (sequential) bir STL kabı (container) olduğunu bilmeyen var mı? Diğer STL kaplarının hemen hepsinde olduğu gibi, C++11 ile birlikte artık bir string nesnesini std::initializer_list sınıfı öğesi ile de başlatabiliyoruz:
Bu kurucu işleve de bir örnek verelim:
Yine diğer STL kaplarında olduğu gibi C++11 ile birlikte string sınıfımızın da aralık (range) parametreli bir kurucu işlevi var:
Bu kurucu işlevle stringimizi bir başka STL kabında tutulmakta olan karakterlerle başlatabiliriz:

Necati Ergin

C ve Sistem Programcıları Derneğinde eğitmen olarak çalışıyor.

Bunlar da ilginizi çekebilir

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Kod Eklemek İçin Okuyun