C++’ta değer gönderme

Fonksiyonlara değer göndermek için birçok yol vardır. Bunların bir kısmı fonksiyona gelen ve fonksiyondan giden değerler olabilir. Bu değerler yalnızca bir class’ın fonksiyonları (member function) ile alakalı olabilir. Yani bir iç değişken. Böyle bir durumda biz bir şekilde bunlara istenmeyen herhangi bir etki yapılabilmesini engellemek durumundayız. const’un dikkatli bir biçimde kullanılmasıyla kodlarımız daha güvenli, değişkenlerin herhangi bir şekilde oynanamayacağı bir hale getirebiliriz.

Basit Fonksiyonlar

Burada basit, bir sayının 2 katını dönen bir fonskiyon var.

değer göndererek çağırma

int double(int number) {
number=number*2;
return number;
}

int main() {
i=7;
int j = double(i);
}

i değişkeni değer olarak gönderildi (pass by value), yani number değişkeninin içinde, i’nin içindeki değer var. Ama sonrasında bu iki değişken arasında hiçbir bağlantı yok. En sonda i’nin değeri 7 ve j’nin değeri de 21 olur.

referans göndererek çağırma

Bazen bir fonksiyona gönderdiğiniz değişkenin değerinin bu fonksiyona bağlı olarak değişmesini istersiniz. Bu durumda fonksiyonu referans göndererek çağırmaya ihtiyacınız vardır.

int double(int& number) { /* ampersand (‘and’ işareti)’a dikkat edelim */
number=number*2;
return number;
}

int main() {
i=7;
int j = double(i);
}

Burada number değişkeni bir nevi takma ad oluyor ‘i’ için. double fonksiyonu çağrıldıktan sonra main’deki i 21 olacak, j de aynı şekilde 21 olacak.

const Kullanımı

const keyword’ü değerlerin değişmesini engellemek adına birkaç farklı şekilde kullanılabilir. Örneğin, önceki double fonksiyonu(nu ben değiştirdim) örneğiniinceleyelim, kod derlenemeyecek, çünkü number değişkeninin değeri değiştirilemez.

int double(const int& number) {
number=number*2;
return number;
}

İleride const’un daha farklı kullanımlarını göreceğiz.

Class fonksiyonları

Bir class’ın içindeki bir parçayı çağırırken, tüm yukarıdaki seçenekler uygundur, ama const başka bir yolla da kullanılabilir. Varsayalım double, c isimli bir class’ın içinde olsun. Bu durumda fonksiyon prototipimiz şu şekilde olur.

int c::double(const int& number) const;

Bir önceki örneğe benziyor ama en sondaki const keyword’ü “ayrıca, double fonksiyonu c class’ının değişkenleri üzerinde değişiklik yapamaz anlamına geliyor. Bu güvenlik özelliği, mümkün olan her yerde kullanılmaya değer. Size şağıda örnek bir kod

#include <iostream>
using namespace std;

class c
{
public:
int val;
void f(const int& arg) const;
};

// c class’ının fonksiyonu
void c::f(const int& arg) const {
cout <<  “arg=” << arg << endl;
// Alttaki iki satır derleme hatasına sebep olur. Bu yüzden comment olarak duruyorlar.
// arg=9;
// val=9;
}

int main()
{
int i;
c test_class;
i=7;
test_class.f(i);
cout << “i=” << i << endl;
}

C++’ta, referanslar genellikle C’deki pointer’ların kullanıldığı yerlerde kullanılır, yani eğer pointer’lar ile ilgili tecrübeli değilseniz, alttaki kısmı atlayıp doğruca nasıl değer döndüreceğinizle ilgili kısma atlayın.

Pointer kullanarak argüman gönderme

Pointerlardan uzak durmak genellikle daha iyidir ama bazen kullanmanız gerekir. Az önceki referans örneğinin pointer versiyonu:

int double(int* number) {
*number=*number*2;
return *number;
}

int main() {
i=7;
int j = double(&i);
}

Bu, “call by reference” yani referansla çağırma kullanır. (ama C++’ın referans sistemini değil.) yani *number’ı değiştirirseniz, i değeri de değişir.

Pointer’lar ile const kullanımı

C++’ta, referanslar her zaman const’tur. pointer’lar işin içine girdiğinde ekstra ihtimaller de ortaya çıkar(ve ekstra kafa karışıklıkları). const kullanırken const’un yeri önemlidir.

  • int double(const int* number); – referans ile, ama bu sefer fonksiyonun çağrıldığı yerdeki değişken değiştirilemez: yalnızca değeri okunabilir.
  • int double(int* const number); – referans ile. pointer değiştirilemez, ama işaret ettiği şey (yani çağıran fonksiyondaki değer) değiştirliebilir.
  • int double(const int* const number); – referans ile. pointer değiştirilemez, ne kendisi, ne de işaret ettiği şey.

C++’ta değer döndürme

f fonksiyonunun int bir değer döndürmesinin birçok yolu vardır.

  • int f(); – integer bir değer döndürür, ilk örnekteki gibi. En kolay ve en güvenli yoldur.
  • void f(int& ans); – bu kullanımda siz bir değişkeni(n adresini) parametre olarak gönderirsiniz, return değeri yerine, buraya atama yaparsınız.Bu yöntemin avantajı, sizin birkaç şeyi return etmenize olanak sağlamasıdır. (Birkaç parametre ve bir de return type olarak kullanırsanız mesela…)
  • int* f(); – integer’a pointer döner. Ne yaptığınızdan tam anlamıyla haberdar olmadıkça bunu kullanmayın. Bu yöntemin riskleri vardır. Aşağıdaki örneklerine bakın:
  • #include <iostream>
    using namespace std;int* f() {
    int j=9;
    cout <<  “j=” << j << endl;
    // Sonraki satırda integer j’ye pointer dönen kod var.
    // j local variable’dır. (Yerel değişken)
    // Fonksiyonun işi bittiğinde bu, tekrar kullanım için müsait bir hafıza olacaktır.
    // Hemen yerine yeni değer yazılacak demiyoruz fakat yapıldığında 9 değeri gitmiş olacak.
    // Bu satır kurallara aykırı değil fakat, bazı derleyiciler uyarı verir.
    return &j;
    }int main()
    {
    int *p;
    p=f();
    cout << “*p=” << *p << endl;
    }
  • int& f(); -bir integer referansı döndürür. Bu, pointer döndürme durumuyla aynı risklere sahiptir. Şunu da eklemek gerekir ki, referanslar, pointer’lardan farklı olarak, 0(sıfır) değerine sahip olamazlar. Yani siz 0 değerini hata kodu olarak da kullanamazsınız.

Bir Alıştırma..

(korkak insanlar için değil!)

const int* c::f(const int * const arg) const;

kodu kurallara uygun bir kullanımdır. İlk önce bunun ne anlama geldiğini çözmeye çalışın, sonra bir program yazarak derleyicinizin sizin beklediğiniz kurallara uyup uymadığını test edin.

Cambridge Universitesi Mühendislik Bölümü
Bilgiler Tim Love (tpl) tarafından sağlanmıştır.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s