Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
C++ Referans, değer ve işaretçi ile parametre geçirmek.
#1
Merhaba topluluk, bu yazıda bir fonksiyonların veya metodların aldığı parametreler hakkında C++ üzerinde nasıl olduğundan bahsedeceğiz. Bu konuyu bilmeden önce fonksiyonlar, işaretçiler, referanslar ve parametreler hakkında bilgilere sahip olmanız gerekli. Bu yazıyı paylaşacaksanız adımı ve soyadımı "Ali Kubur" paylaşırsanız sevinirim.

Başlıklar:
0-) Değer ile geçirmek (Passing by value)
1-) Referans ile geçirmek (Passing by reference)
2-) İşaretçi ile geçirmek (Passing by pointer)


0-) Değer ile geçirmek(Passing by value): 
İlk olarak değer geçirmeyi anlayalım. Aşağıdaki kodu okuyun ve çıktısını tahmin edin.

// Değer ile geçirmek için örnek bir program. 
#include <iostream>

// Parametreyi değerle geçirmek (passing by value)
void DegerleGecir(int yeniSayi)
{
    yeniSayi = 42;
}

int main()
{
    // basit bir sayi adında nesne oluşturuyorum ve 3 sayısını atıyorum.
    int sayi = 3;
    
    // DegerleGecir fonksiyonunu çağırıyorum ve parametre olarak sayı nesnesini değer ile geçiriyorum(passing by value)
    DegerleGecir(sayi);
    
    // sayıyı yazdırıyorum
    std::cout << sayi << std::endl;
    return 0;
}

Program çıktısını eğer 42 olarak tahmin ettiyseniz yanlış! Bu programın çıktısı 3 olacaktır. Evet bu bir derleyici veya sizin hatanız değil çünkü fonksiyon parametresini "Değer ile geçirdiniz". İsterseniz kodu kendiniz yazıp deneyin.

Eğer metodu veya fonksiyonu değer ile geçirirseniz nesnenin aslına etki etmez. Fonksiyon geçirilmesi aşamasında (int yeniSayi)'nın "stack" üzerinde bir kopyası oluşturulur. Bu değişkenin veya nesnenin(yani yeniSayi) kopyası üzerinden işlem yapılır ve nesnenin orjinaline etki etmez. Metodun veya fonksiyonun kapsamı(scope) bittiğinde bu nesne "stack" üzerinden çıkartılır. 

1-) Referans ile geçirmek(Passing by reference):
Pekala, peki ya nesnenin veya değişkenin kendisine etki etmek için ne yapacağız? Ufak bir sihir yapacağız. Referansla geçirmek için veri tipi belirttikten sonra & operatörünü yerleştirin.

// Referans ile geçirmek için örnek bir program. 
#include <iostream>

// Parametreyi referansla geçirmek için veri tipinden sonra & operatörünü kullanıyorum.
void ReferanslaGecir(int& yeniSayi)
{
    yeniSayi = 42;
}

int main()
{
    // basit bir sayi adında nesne oluşturuyorum ve 3 sayısını atıyorum.
    int sayi = 3;
    
    // sayı nesnesini değer ile geçiriyorum(passing by parameter)
    ReferanslaGecir(sayi);
    
    // sayıyı yazdırıyorum
    std::cout << sayi << std::endl;
    return 0;
}

Bu program çıktı olarak 42 yazar. Çünkü referansla geçirdik ve nesnenin kendisine etki etti. Yani orjinal olan sayi nesnesi/değişkeni değişti.

2-) İşaretçi ile geçirmek(Passing by pointer):
Referansla geçirmek ile aynı şey. fakat geçirilen bir işaretçi (pointer) olduğu için "nullptr" olabilir. Bunu kontrol etmek gerekebilir. İçeriğini değiştirmek ve ona ulaşmak için * operatörünü kullanarak işaretçinin değerini alırız. Normalde işaretçi bir adres tuttuğu için de-referans ettik.

// İşaretçi ile geçirmek için örnek bir program. 
#include <iostream>

// Parametreyi işaretçi(pointer) geçirmek
void IsaretciGecir(int* yeniSayi)
{
    *yeniSayi = 42;
}

int main()
{
    // basit bir nesne(değişken) oluşturuyorum ve 3 sayısını atıyorum.
    int sayi = 3;
    
    // sayı nesnesini işaretçi(pointer)  ile geçiriyorum(passing by pointer)
    IsaretciGecir(&sayi);
    
    // sayıyı yazdırıyorum
    std::cout << sayi << std::endl;
    return 0;
}

Hangisini kullansam daha hızlı çalışır?
C++ programcıları genelde referans ile geçirir ve referans ile geçirmek daha avantajlıdır çünkü direkt olarak hafıza içerisindeki adresi bilir. Bir işaretçiyi geçirirseniz öncelikle ona erişmek * operatörü ile de-referans etmek zorunda kalacaksınız. Bu da ekstra bir işlem görür. Eğer değer ile geçirirseniz bir kopyasını oluşturur ve bu büyük boyutlu nesneler için önemli performans kaybına yol açabilir.

Kapsam(Scope) nedir?
Her bir fonksiyonun ve programın kapsamı vardır. C++ dilinde fonksiyonlar/metodlar kapsamlar içerisinde işlem görür.
{
 // burası bir kapsamdır.
  {
     // burası başka bir kapsamdır.
  }
}

OOP içerisinde nasıl kullanacağım?
Üye-Fonksiyon parametrelerini normal fonksiyonlardaki gibi geçirebilirsiniz.
değer ile geçirmek istiyorsanız (veri tipi parametre)
Örneğin referansla geçirmek istiyorsanız (veri tipi& parametre)
işaretçi ile geçirmek (veri tipi* parametre)
Cevapla
#2
Yine çok faydalı bir rehber! Teşekkürler!
Ne mutlu türküm diyene!

M. Kemal Atatürk
Ara
Cevapla
 


Hızlı Menü:


Unreal Engine Türkiye

This forum is only for fans and support. It has nothing to do with Epic Games.

Bu site sadece fan ve destek amaçlıdır. Epic Games ile bir ilgisi yoktur.