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:
#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!
Hiç yorum yok:
Yorum Gönder