Menu

C++ Fonksiyonları: Bildirme, Tanımlama ve Çağırma (Örneklerle)

C++'ta fonksiyon nasıl yazılır: dönüş tipi/ad/parametre anatomisi, bildirim ile tanım farkı, değer döndürme, void fonksiyonlar ve eksik return ile prototip unutma gibi tuzaklar.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

Fonksiyonlar Neden Vardır

Fonksiyon, çağırarak istediğiniz zaman çalıştırabileceğiniz, adı olan bir kod bloğudur. Aynı mantığı birkaç yerde tekrarlamak yerine onu bir kez yazar, ona bir ad verir ve ihtiyaç duyduğunuz her yerde o adı çağırırsınız. Bu, programları daha kısa, daha okunaklı ve düzeltilmesi daha kolay hâle getirir: mantığı tek bir yerde değiştirirsiniz ve onu çağıran herkes güncellemeyi alır.

Aslında bu süre boyunca zaten bir fonksiyon çağırıyordunuz: main. O, her C++ programının başladığı giriş noktasıdır. Şimdi kendi fonksiyonlarınızı yazacaksınız. Daha önce gördüğünüz aralık tabanlı for gibi döngüler, çoğu zaman fonksiyonların içinde yaşar; böylece tüm bir mantık parçasını adıyla yeniden kullanabilirsiniz.

Bir Fonksiyonun Anatomisi

Her fonksiyonun dört parçası vardır: bir dönüş tipi, bir ad, parantez içinde bir parametre listesi ve süslü parantez içinde bir gövde.

int add(int a, int b) {   // dönüş tipi | ad | parametreler
    return a + b;         // gövde
}
  • int dönüş tipidir: fonksiyonun geri verdiği değerin türü.
  • add onu çağırmak için kullandığınız addır.
  • (int a, int b) parametrelerdir: çağıranın sağladığı girdiler.
  • Süslü parantezler gövdeyi, yani onu çağırdığınızda çalışan kodu tutar.

İşte tam bir programdaki hâli. Fonksiyonu main'in üzerinde tanımlamak, main onu çağırdığında onu görebilmesi anlamına gelir.

add(2, 3) çağrısı fonksiyonu a = 2 ve b = 3 ile çalıştırır ve ifadenin tamamı döndürülen değere dönüşür. Onu bir değişkende saklayabilir ya da ikinci cout satırında olduğu gibi doğrudan başka bir ifadenin içinde kullanabilirsiniz.

Bir Değer Döndürmek

return ifadesi iki iş yapar: çağırana bir değer geri verir ve fonksiyonu hemen sonlandırır. Bir return'ten sonra gelen kod çalışmaz; denetim doğrudan fonksiyonun çağrıldığı yere geri döner.

Döndürülen değerin tipi, bildirilen dönüş tipiyle eşleşmeli (ya da ona dönüştürülebilmeli) dir. int olarak bildirilen bir fonksiyon bir int döndürmelidir; hiçbir şey döndürmemek ya da return olmadan sondan çıkmak, void olmayan herhangi bir fonksiyon için bir hatadır.

Void Fonksiyonlar

Her fonksiyon bir değer üretmez. Bir fonksiyon yalnızca bir şey yapıyorsa (çıktı yazdırma, durum güncelleme) dönüş tipi void olur. Bir void fonksiyon erken çıkmak için yalın bir return; kullanabilir ya da basitçe kapanış süslü parantezine kadar çalışabilir.

Bir void fonksiyonun sonucunu kullanmaya çalışmak (int x = greet("Ada");) bir derleme hatasıdır, çünkü atanacak bir değer yoktur. Sık yapılan bir hata, bir void fonksiyonun içine return someValue; yazmaktır; derleyici bunu da reddeder.

Bildirimler ve Tanımlar

C++ bir dosyayı yukarıdan aşağıya okur, bu yüzden varsayılan olarak bir fonksiyon, onu çağıran kodun önünde görünmelidir. Bu sıralama elverişsiz olduğunda fonksiyonu bir bildirim (prototip de denir) ve bir tanım olarak ikiye ayırırsınız.

Bir bildirim, fonksiyonun imzasını belirtir ve noktalı virgülle biter; gövdesi yoktur. Derleyiciye "bu fonksiyon var; onu şöyle çağırırsın" sözünü verir. Tam tanım daha sonra, hatta main'den sonra bile gelebilir.

  1. satırdaki prototip olmasaydı derleyici, main içindeki square(5)'e, square'i hiç görmeden önce ulaşır ve derleme başarısız olurdu. Prototipler aynı zamanda başlık dosyalarının pek çok kaynak dosyanın aynı fonksiyonları paylaşmasını sağlama biçimidir. Bir bildirimde parametre adlarının isteğe bağlı olduğunu unutmayın; int square(int); de aynı şekilde çalışır; derleyici için yalnızca tipler önemlidir.

Sık Yapılan Hatalar

Birkaç tuzak yeni başlayanları tekrar tekrar yakalar:

  • Bildirmeden önce çağırmak. "add was not declared in this scope" hatasını alıyorsanız fonksiyon ilk çağrısının altında tanımlanmıştır ve bir prototipi yoktur. Tanımı yukarı taşıyın ya da bir prototip ekleyin.
  • Return etmeyi unutmak. void olmayan bir fonksiyonun sonuna return olmadan ulaşmak tanımsız davranıştır; çağıran taraf çöp alır. Uyarılar açık olarak derleyin (-Wall), derleyici bunu işaretleyecektir.
  • Tanımlama ile çağırmayı karıştırmak. Bir tanımın süslü parantez içinde gövdesi vardır ve sonunda noktalı virgül yoktur. Bir bildirimin noktalı virgülü vardır ve gövdesi yoktur. Bunları karıştırmak (tanımlamak istediğiniz bir fonksiyonun parametre listesinin hemen ardına noktalı virgül koymak gibi) kafa karıştırıcı hatalar üretir.
  • Dönüş değerini göz ardı etmek. Tek başına bir satırdaki add(2, 3); derlenir, ama hesaplanan toplam sessizce atılır. Bir fonksiyonun döndürdüğü şeyi gerçekten kullandığınızdan emin olun.
// Bir tanım gibi görünüyor, ama yersiz ; onu bir bildirime ve
// ardından gelen artık bir bloğa dönüştürüyor, sık yapılan bir yazım hatası:
int triple(int n);   // <- bu ; ifadeyi sonlandırır
{
    return n * 3;    // n burada tanımlı değil; bu blok artık öksüz kaldı
}

Sırada: Fonksiyon Parametreleri

Fonksiyonların parametre listeleri aracılığıyla girdi aldığını gördünüz, ama bu işin çok daha fazlası var. Sonraki sayfa fonksiyon parametrelerini derinlemesine ele alıyor: değerle geçirme ile referansla geçirme, varsayılan argümanlar, const parametreler ve bu seçimin fonksiyonunuzun çağıranın verisini değiştirip değiştiremeyeceğini nasıl etkilediği.

Sıkça Sorulan Sorular

C++'ta bir fonksiyon nasıl yazılır?

Ona bir dönüş tipi, bir ad, parametreler için parantezler ve süslü parantez içinde bir gövde verin: int add(int a, int b) { return a + b; }. Onu adıyla ve argümanlarla çağırın, örneğin add(2, 3). Fonksiyon hiçbir şey döndürmüyorsa dönüş tipi olarak void kullanın.

C++'ta fonksiyon bildirimi ile tanımı arasındaki fark nedir?

Bir bildirim (ya da prototip), derleyiciye fonksiyonun adını, dönüş tipini ve parametrelerini söyler ve noktalı virgülle biter: int add(int a, int b);. Bir tanım ise ayrıca süslü parantez içinde gövdeyi de sağlar. Bir fonksiyonu main'den önce bildirip daha sonra tanımlayabilirsiniz; bildirim, tanım görünmeden önce fonksiyonu çağırmanıza olanak tanır.

Bir C++ fonksiyonu değer döndürmezse ne olur?

void bir fonksiyonda hiçbir şey olmaz; basitçe sona erer. Ancak void olmayan bir fonksiyonda, return olmadan sona ulaşmak tanımsız davranıştır: çağıran taraf çöp bir değer alır ve program hatalı çalışabilir. Çoğu derleyici bu konuda uyarır; void olmayan bir fonksiyonun her yolunda mutlaka bir değer döndürün.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA