C++ Fonksiyonlar

    Programlamada çok tekrar ettiğimiz kod satırlarını ya da kod bloklarını lazım olduğu her yerde yeniden yazmak yerine, yahut kopyala yağıştır yapmak yerine, söz konusu bloğu bir fonksiyon olarak tanımlar ve gerektiği yerde fonksiyonu çağırarak bunu bir rutin haline getirebiliriz.
    C++ 'da fonksiyonlar parametrik olarak tanımlanabilirler, yani, bir fonksiyona değer gönderebiliriz. Fonksiyonun tanımlandığı tipe göre bir dönüşü olmak zorundadır, tipsiz dediğimiz void tanımlaması için bu durum istisnadır.
    Programlama dillerindeki fonksiyon kullanımı matematiksel fonksiyonları andırmaktadır ve aynı zamanda matematiksel fonksiyonlar programlama dillerindeki fonksiyonların esin kaynağıdır. C++ için fonksiyon tanımının tam karşılığı (procedure) prosedür kelimesi olsa gerek. Bu manada tam olarak matematiksel fonksiyonlarla eşleştirmek doğru olmayabilir.
    Fonksiyonlar genellikle belirli bir işlevi yerine getirmek içindir ve bir programın herhangi bir yerinden çağırılabilirler, bunun için azami şart fonksiyonun varlığının bildirilmesi(declaration) ve tanımlanmasıdır (definition). C++ için bu fonksiyon bildirimleri, -bildirim denmesinin sebebi fonksiyonun sadece prototipinin yazılıp içeriğinin, yani yaptığı/yapacağı işlemlerin kodlanmadığı kısım olmasıdır- hem ana kod içerisinde kalabalık etmemesi açısından hem de programın farklı kaynak kodu sayfalarında çağırılabilip kullanılabilmesinin kolaylaştırılması açısından .h uzantılı header files dediğimiz dosyalar içerisinde yapılır. Bir programı yazmak kadar o programlama dilinin kod yazma disiplinine hakim olmak ve o disiplini uygulamak da önemlidir.

    Fonksiyon Bildirimleri ( Function Declarations )

    Bir fonksiyon bildirimi, derleyiciye bu fonksiyonun var olduğunu, fonksiyonun bir prototipini yazarak bildirilmesine denir. Söz dizimi aşağıdaki gibidir:

int topla(int a, int b);

satır sonunda noktalı virgül olduğuna dikkat edin. Bu satırla derleyiciye benim int tipinde geri dönüşü olan parametre olarak iki tane integer tipinde sayı alan ve adı topla olan bir fonksiyonum var ileride ya da kodun başka bir yerinde bu fonksiyonu yazacağım demiş oluyoruz. burada a ve b tiplerini fonksiyonun gövdesi dediğimiz kısımda kullanacağız. Fonksiyon bildirimi yapılırken değişken isimlerini yazmak zorunda da değiliz:

int topla(int, int);

iki örnek için de bir geri dönüş tipi belirledik bu fonksiyonlar geriye bir dönüş yapmak zorundadır, fonksiyonumuz sadece bir iş yapacak ve geriye hiçbir değer döndürmesine gerek yoksa void tipinde tanımlanabilirler :

void ekranaYaz(const char* metin);

içerisine parametre olarak verdiğimizi metini ekrana yazması için bir fonksiyon yazıyorsak bize bir değer döndürmesine ihtiyaç duymayız.

    Fonksiyonun Çağırılması (function call)

    Bir fonksiyonun bildirimi yapıldıktan sonra çağırılabilir. Bir fonksiyonu satır sayısı bakımından yukarıda çağırıp alt satırlarda bildirim yapamazsınız.

#include <iostream>
 
int topla(int, int);
 
int main() 
{
	/*
	 Burada sadece fonksiyon bildirimi yaptık
	 fonksiyonun kendisi bu sayfa içerisinde yazılmamış olsa da
	 çağırılması legaldir, zira fonksiyon başka bir object
	 dosyasında tanılanıyor olabilir, hiç tanımlanmamışsa 
	 hata alıyor oluruz. Yani Linker derki bana bu fonksiyonu
	 tanımlayacağını söyledin ama tanımlamadın.
	*/
	topla(5,17);
}

burada fonksiyonun değerlerini de ilk parametre için 5 ikinci parametre için 17 olarak göndermiş olduk.

    Fonksiyonun Tanımlanması (Definition)

    Fonksiyonun tanımlanması bildirilmesi gibi başlar ancak artık değişken isimlerini vermeli ve fonksiyonun yerine getirmesini istediğimiz kodları süslü parantez içerisine yazmamız gerekir.

int topla(int a, int b) // fonksiyon parametrelerine ulaşmak için isim veriyoruz
{
	int sonuc = a + b; // sonuc adıyla int tipinde bir değişken tanımlayıp
					   // a + b ye eşitliyoruz.
	return sonuc;	   // geri dönüş değerimizi belirliyoruz.
}

burada mutlaka bir değişken tanımlayıp onu döndürmek zorunda değiliz return a + b; 'de aynı işi yapacaktır. return ile döndürülen değer fonksiyonun çağırıldığı yere yazdırılır, bu tam olarak şu demektir:

int toplam = topla(5,17);
// int toplam = 22;

topla(5,17) yerine 22 yazıldığını düşünebilirsiniz.

    Fonksiyon Aşırı Yükleme (Function Overloading)

    Bunu bu şekilde Türkçeye çevirmeyi hiç sevmiyorum ama yerine de uygun bir şey bulamadım. Bu tam olarak aynı isimde fakat farklı parametreler alan bir fonksiyon kullanmak için kullanılır. Yukarıdaki örnekte iki sayıyı topladık, üç ayrı sayıyı toplamamız gereken bir fonksiyona ihtiyac duyuyor olduğumuzda farklı isim vermek zorunda değiliz, aynı isimle farklı parametreler alan ve tamamen farklı işlemler yapan fonksiyonlar yazabiliriz :

int topla(int, int);
int topla(int, int, int);

bu durumda her iki fonksiyon için de ayrı ayrı tanımlama yazmanız gerekiyor:

nt topla(int a, int b) // fonksiyon parametrelerine ulaşmak için isim veriyoruz
{
	int sonuc = a + b; // sonuc adıyla int tipinde bir değişken tanımlayıp
					   // a + b ye eşitliyoruz.
	return sonuc;	   // geri dönüş değerimizi belirliyoruz.
}
 
int topla(int a, int b, int c)
{
	return a + b + c;
}

Visual Studio kullanıyorsanız, (tavsiyemdir bana güvenin şuanda en güçlü IDE VS'dir.) fonksiyonun adını yazıp üzerine gelirseniz tüm overload durumlarını görebilirsiniz:

C++ function overloading in Visual Studio

    Fonksiyon Varsayılan Parametre Değerleri (default parameter)

    Fonksiyon içerisine gönderilecek parametrelere varsayılan değerler verebiliriz, bu sayede o parametrenin kullanılması zorunluluğu da ortadan kalkmış olur, ancak bunu fonksiyon bildirimlerinde yapmamız ve değer vereceğimiz parametreleri en sona yazmamız gerekmekte:

#include <iostream>
 
int topla(int a, int b = 17);
int topla(int, int, int);
 
int main() 
{
	/*
	 Burada sadece tek bir int parametresi alan topla
	 fonksiyonu olmamasına rağmen, ikinci parametreye
	 varsayılan değer atadığımız için bu şekilde kullanabildik.
	*/
	
	int toplam = topla(5);
	// int toplam = 22;
}

bu durumda fonksiyona ikinci bir parametre girilmediği için onu 17 olarak aldı ve girilen ilk parametre olan 5 ile toplayıp aynı sonucu üretmiş oldu. Ancak

int topla(int a = 5, int b);

şeklinde kullanmamız mümkün değil, bu size "Severity Code Description Project File Line Suppression State

Error (active) E0306 default argument not at end of parameter list Project1 E:\!Blog\C++ Dersleri\Project1\merhabadunya.cpp 4

"gibi bir hata üretir. Varsayılan değer atanacak parametreler yallah en sona!


Önceki Konu : C++ Derleme Süreci




Yorumlar

Bu blogdaki popüler yayınlar

Arduino IDE Kod Satır Numaraları Nasıl Açılır

DMD2TUR | Arduino P10 Led Panel için Türkçe Karakter Desteği | Arduino P10 Led panel Türkçe yazı yazma

P10 Led Panel Nasıl Sürülür - Arduino kod