C++ Function Overloading & Function Overloading Resolution


#1
  * {
    font-family: Georgia, Cambria, "Times New Roman", Times, serif;
  }
  html, body {
    margin: 0;
    padding: 0;
  }
  h1 {
    font-size: 50px;
    margin-bottom: 17px;
    color: #333;
  }
  h2 {
    font-size: 24px;
    line-height: 1.6;
    margin: 30px 0 0 0;
    margin-bottom: 18px;
    margin-top: 33px;
    color: #333;
  }
  h3 {
    font-size: 30px;
    margin: 10px 0 20px 0;
    color: #333;
  }
  header {
    width: 640px;
    margin: auto;
  }
  section {
    width: 640px;
    margin: auto;
  }
  section p {
    margin-bottom: 27px;
    font-size: 20px;
    line-height: 1.6;
    color: #333;
  }
  section img {
    max-width: 640px;
  }
  footer {
    padding: 0 20px;
    margin: 50px 0;
    text-align: center;
    font-size: 12px;
  }
  .aspectRatioPlaceholder {
    max-width: auto !important;
    max-height: auto !important;
  }
  .aspectRatioPlaceholder-fill {
    padding-bottom: 0 !important;
  }
  header,
  section[data-field=subtitle] {
    display: none;
  }
  </style></head><body>

C++ Function Overloading & Function Overloading Resolution

~> Konu içerisinde function overloading ve resolution mekanizmalarına değineceğiz. Derleyicinin arka planda bunu nasıl yaptığını, hangi aşamalardan geçtiğini anlatmaya çalışacağım…

~> Fonksiyonların aşırı yüklenmesi çevirisi yanlış bir anlama çıkabiliyor. Aşırı olan birşey iyi değildir, burada fonksiyonların yüklenmesi diyelim.

~> C++ dilinde bu mekanizma var, C dilinde yok…

~> Function overloading basit olarak aynı isimli fonksiyonların bir arada bulunmasıdır.

~> Amaç: Clientin işini kolaylaştırmak

~> C dilinde böyle bir yapının olmamasından dolayı şöyle sıkıntılar çıkmıştır. Her fonksiyon için ayrı bir isim oluyor. Örneğin mutlak değer fonksiyonu abs(), floating-point number için fabs(), long int için labs().. işte böyle bir sıkıntı söz konusu.

~> C dilinde olmamasının sebebi derleyicinin kodunu küçük tutmak. Çünkü böyle bir yapıda derleyecinin kodu çok daha fazla büyüyecek. Bu karmaşık derleyici yoran bir mekanizma. Derleyicisi en az %30 kadar büyütürdü.

~> Runtime maliyeti yok, çünkü ne kadar aynı isimli fonksiyon olsa da hangi fonksiyonun çağırıldığı, derleyici compile time da anlıyor. Yani linker a dışsal referans olarak bunu anladıktan sonra yazıyor.

~> Hangi fonksiyon çağrıldığı anlama, compile time da static binding yada early binding denir, bind (ilişkilendirme, bağlama)

Dynamic binding | C++ OOP en önemli araçları
Late binding | Çalışma zamanı çokbiçimliliği (Runtime Polymorphism)


Derleyicinin hangi fonksiyonu çağırdığını nasıl anlar?

~> (Function Overload Resolution) derleyicinin dilin kurallarına dayanarak hangi fonksiyonu çağrıldığını anlama işine denir

~> (Fonksiyon imzası) bildirimden tür çıkartım, geriye kaç parametre, kaç değişken var ve türleri neler gibi…

~> İmza terimini duyduğunuzda, fonksiyon geri dönüş değerinin türü dahil değil

~> Bildirim dediğimizde fonksiyon geri dönüş değeri türü dahil


Fonksiyon Overloading dendiğinde 3 koşulun olması gerekiyor

  1. Fonksiyon isimleri aynı olacak
  2. Scopeları aynı olucak (aynı scope larda fonksiyonlar birbirini overload eder, farklı scopelardaki fonksiyonlar birbirini maskeler)
  3. İmzaları farklı olucak (parametre sayısı veya parametre turu)

~> Aynı scope ta aynı isimli 2 fonksiyon varsa ve function overloading yoksa 2 şey olabilir, ya error yada redeclaration(yeniden bildirim)

~> Function Overloading için distinct type olmalıdır

~> C++11 de typedef bildirimlerinin yerine uydurulan ayrı bir araç var

~> typedef isimleri distinct tür değildir, bu yüzden typedef isimleriyle function overload olmaz. C++11 de artık typedef bildirimlerinin yerine uydurulan ayrı bir araç var. “using Kerem int” gibi….

~> using bildirimi, typedef te olmayan ilave anlamlarda var

Yeniden Bildirim (Redeclaration)Type Mismatch in RedeclarationYeniden Bildirim (Redeclaration)

Asla pointer olmayan bir parametreyi const yapmayın, yaparsak ne olur?

~> Fonksiyon bildirimi var yada yok,

~> Derleyici burada ki const anahtar sözcüğünü ciddiye almaz,

~> Neden ciddiye almaz? Çünkü bu call by value bir anlam yüklesek x i değiştiremem, sen onu değiştirsende değiştirmesende benim değişkenime olan birşey yok, o yüzden beni ilgilendirmiyor

~> 1. pointer olmayan parametreleri bildirimde veya tanımda const yapmayın onun bir anlamı yok,

~> 2. derleyici bunu görmez

~> Eğer 2 parametre türleri aynı ise pointer değilse biri T türünden ise öteki const T türündense function overloading değil, errorde değil, redeclaration

Yeniden BildirimGeçerli, Const OverloadingGeçerli, Pointer OverloadingGeçerli, Biri call by value digeri call bu referenceGeçerli, Funtion Overloading (Default Parameter)

Ufak tekrar (function overloading için olması gereken):
~> Scope aynı olacak, İsimler aynı olacak, İmzalar farklı olacak

enum dan -> int e dönüşüm var
doğal türlerden -> enum a dönüşüm yok

~> Farklı türden pointerlar arası dönüşüm yok
T * void * a dönüşür
void * T * a dönüşmez

~> Bir pointera tam sayı olarak 0 atarsanız tam sayı olan 0 null adresine dönüşür


FUNCTION OVERLOAD RESOLUTION

~> Derleyicinin hangi fonksiyonu çağrıldığını anlama mekanizması

~> 2 şekilde sonuçlabilir, ya error ya legal

~> Yani ortada bir function overloading var diye yapılan her çağrı doğru olmayabilir

~> Error ise 2 seçenek var,

  1. Yanlış function çağrılması(no match),
  2. Ambiguity (Çift anlamlılık hatası)

~> Aday fonksiyonlar,

  1. İlk aşamada sadece aynı isimde olmaları yeterli aynı scope ta olucak, farklı scope ta ise maskeleme olur,
  2. İkinci aşamada derleyici uygun fonksiyonları bulmak ister.. Bu aşamada hiç uygun fonksiyon bulamassa error olur. Burada ki aşama uygun fonksiyonları bulup eleme yapma.
  3. Birden fazla uygun fonksiyon varsa derleyici dilin kurallarına göre argümanlardan parametre değişkenlerine yapılan dönüşümü belirli kalite grubuna ayıracak. Bunlara bir renk vericek gibi düşünebiliriz. Yani her argümandan her parametre değişkenine dönüşümün kalitesi aynı değil. Eğer fonksiyon çağırısındaki argümanın diyelim ki birinci fonksiyona dönüşümü A kalitesinde ise ikinci fonksiyonun ilgili parametresine dönüşümü ondan daha düşük B kalitesinde ise A seçilecektir.

Yani bu aşama da derleyici fonksiyonları derecelendirecek. Bu derecelendirmeyi neye göre yapıyor?

~> Bir argümandan bir parametre değişkenine legal olarak atama yapılabiliyorsa dönüşümün kalitesi 4 kalite gurubundan biri olacaktır. (Yüksek kaliteden -> Düşük kaliteye)

1. EXACT MATCH (Tam Uyum)
2. PROMOTION (Terfi — Yükseltme)
3. STANDARD CONVERSION (Standard Dönüşüm)
4. USER DEFINED CONVERSION

~> Bir argüman bir parametre değişkenine değer atanırken, derleyici function overloading seçimi yaparken rank vericek, derecelendirecek

~> İkiside aynı ranka sahip ise bu ambiguity(en çok 3. ve 4. case için ambiguity oluyor)


EXACT MATCH

1. Exact match (tam uyum), int argümanı int parametreye göndermek, floatu floata göndermek exact matchtir,

~> Bazı özel durumlarda exact match kabul edilir,

~> a) Eğer fonksiyon parametresi const T * ise bu fonksiyonu T * ile çağırırsak T * dan const * a dönüşüm exact match kabul edilir,

~> b) func(int x); int y = 10; func(y); // sol taraf değerinden sağ taraf dönüşüm exact math l value ~> r value translation

~> c) dizi isimlerini sizeof() operatörü ptr gönderilmesi sonucunda dizinin ilk elemanı adrese dönüştürülüyor

Array to Pointer Conversion

~> d) function pointer

C HatırlatmaFunction Pointer Example

PROMOTION

~> int altı türlerin, int e yükseltilmesi(c de var)(integral promotion)

~> int altı türler — short türleri, char türleri, bool, int e yükseltilmesi

~> Yeni gelen char türleri hariç

~> float tan double dönüşümde promotion

~> Dikkat double dan long double a vs dönüşümleri promotion değil

~> int ten unsigned int ve int ten double bunlar promotion değil


STANDARD CONVERSION

~> Argümandan parametre dönüşümü legal ama exact match değil se promotion değil se o zaman standard conversion
~> Örnek int ten double atama legal, double dan inte
~> unsigned int ten int e standard conversion
~> 0 dan pointer a standard conversion

Standard ConversionHangisi Çağırılır? -> İkiside Standard Conv o zaman -> ambiguity

USER DEFINED CONVERSİON

~> C de olan birşey değil, tamamen C++ özgü

~> Programcı tarafından oluşturulan tanımlanan dönüşümler

~> Bir dönüşüm, biz fonksiyon yazdık diye yapılıyorsa buna user defined conv denir, o fonksiyon yazılmasaydı legal olmıcaktı

Example C++ Function OverloadingExample C++ Function OverloadingExample C++ Function Overloading

Kaynak: https://goo.gl/Ype8il