top of page

C++ Dilinde Fonksiyon Çağrı Operatörünün Overload Edilmesi

  • Writer: Yusuf Hançar
    Yusuf Hançar
  • Oct 12, 2023
  • 3 min read

C++ dilinde overload mekanizmasını anlatmaya operatörlerin overload edilmesile başlamıştık. Buna ait temek kuralları anlatarak örneklendirdik ve o yazımızda da fonksiyon çağrı operatöründen bahsetmiştik. Farklı senaryolar olabileceği için de ayrı bir başlık açmanın faydası olabilir.


SmartCode sc;
sc();	

Buradaki gibi sınıf türünden olan sc nesnesi fonksiyon çağrı operatörünün operandı olacak şekilde çağırılmış ve overload edilmiş ise derleyici tarafından bu overload edilen operatöre çağrı olarak algılanacaktır. Fonksiyon çağrı operatörünü overload eden böyle sınıflara "Functor class" denilmektedir. Ve ismiyle çağrı yapılabilmektedir.


Parametre değişkeni olmadan overload edilebilir.

class SmartCode {
public :
    void operator()()const                     
    {                                                                 
        cout << "SmartCode::operator()()this : " << this << endl;    
    }
};

int main() 
{
    SmartCode sc;

    cout << &sc << endl;
    sc();                                      
}
*****************************
AÇIKLAMA: SmartCode sınıfının içerisinde fonksiyon çağrı operatörü parametresiz void dönüşü olacak şekilde ve const olarak overload edilmiştir. Geri dönüş değeri int, double ... olabilir. const olması da tasarımcıya bağlıdır. Ve çağrı da parametresi olmadığı içinde sc() şeklinde çağrı yapılmıştır.
*****************************
CEVAP:
*****************************

Parametresi olan fonksiyon çağrı operatörü overload edilmesi...

class SmartCode {
public :
    void operator()(int val)const               
    {                                  
        cout << "SmartCode::operator()(int)val : " << val << endl; 
    } 

    void operator()(double dval)const                
    {                                   
        cout << "SmartCode::operator()(double)dval : " << dval << endl;  
    }
};

int main() 
{
    SmartCode sc;

    sc(10);
    sc(2.9);                                    
}
*****************************
AÇIKLAMA: SmartCode sınıfının içerisinde fonksiyon çağrı operatörü int ve double parametreli void dönüşü olacak şekilde ve const olarak overload edilmiştir. Geri dönüş değeri int, double ... olabilir. const olması da tasarımcıya bağlıdır. Ve çağrı da parametresi olmadığı içinde sc(int) ve sc(double) şeklinde çağrı yapılmıştır.
*****************************
CEVAP:
*****************************

Default parametre alan fonksiyon çağrı operatörü overload edilmesi..

class SmartCode {
public :
    void operator()(int val = 10)const                
    {                                   
        cout << "SmartCode::operator()(int)val : " << val << endl;  
    }
};

int main() 
{
    SmartCode sc;

    sc(10);
    sc();                                    
}
*****************************
AÇIKLAMA: SmartCode sınıfının içerisinde fonksiyon çağrı operatörü default parametreli void dönüşü olacak şekilde ve const olarak overload edilmiştir. Geri dönüş değeri int, double ... olabilir. const olması da tasarımcıya bağlıdır. Ve çağrı da parametresi olmadığı içinde sc() ve sc(double) şeklinde çağrı yapılmıştır. sc() şeklinde çağrıda default parametre olan 10 değeri baz alınacaktır.
*****************************
CEVAP:
*****************************

Yapılan çağrılar aslında overload edilen operatör adıyla yapılmış şekilde derleyici tarafından algılanır.

class SmartCode {
public :
    void operator()()const                     
    {                                                                 
        cout << "SmartCode::operator()()" << endl;    
    }
};

int main() 
{
    SmartCode sc;

    sc.operator()();                                      
}
*****************************
AÇIKLAMA: sc() çağrısıyla sc.operatör()() çağrıları aynıdır.
*****************************
CEVAP:
*****************************


#include <iostream>

using namespace std;

class SmartCode { 
public : 
    void operator()(int val)const                
    {                                   
        cout << "SmartCode::operator()(int)val : " << val << endl;  
    }

    void operator ()(double dval)const                 
    {                                   
        cout << "SmartCode::operator()(double)dval : " << dval << endl;   
    } 
}; 

SmartCode func()
{
    return SmartCode{};
}

int main() 
{ 
    SmartCode sc; 
    
    func()(10); 
    func()(5.9);   
}
*****************************
AÇIKLAMA: fonksiyon çağrı operatörü nesneleri bir fonksiyon gibi çağırmaya olanak tanır. 
*****************************
CEVAP:
*****************************

Örnekler ...

#include <iostream>   
#include <cstdlib>

using namespace std; 

class SmartCode { 
private :
    int m_low, m_high; 
    
public : 
    SmartCode (int low, int high) : m_low{ low }, m_high{ high } {}

    int operator()() 
    { 
        return rand() % (m_high - m_low + 1) + m_low; 
    } 
};

void func(SmartCode rnd)  
{ 
    for (int i = 0; i < 5; ++i)  
    {  
        cout << rnd() << " ";  
    } 
}

int main()  
{ 
    SmartCode rnd1{ 10, 20 };      
    SmartCode rnd2{ 20, 40 };

    func(rnd1);
    
    cout << endl;
    
    for (int i = 0; i < 5; ++i)  
    { 
        cout << rnd1() << " "; 
    } 
     
    cout << endl;

    for (int i = 0; i < 5; ++i)  
    {  
        cout << rnd2() << " ";  
    } 
}
*****************************
AÇIKLAMA: 
*****************************
CEVAP:
*****************************

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 

using namespace std;

class SmartCode { 
private :
    size_t m_len; 

public: 
    SmartCode(size_t len) : m_len{ len } {}

    bool operator()(const string& str) 
    { 
        return str.length() == m_len; 
    } 
};

int main() 
{                                      
    vector<string>svec{"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus"};
    cout << "num count : "; 
    size_t len; 
    cin >> len; 

    cout << count_if(svec.begin(), svec.end(), SmartCode{ len }) << endl; 
}
*****************************
AÇIKLAMA: 
*****************************
CEVAP:
*****************************
ree

 
 
 

Recent Posts

See All
C++ Dilinde [[nodiscard]] attribute

C++’ta [[attribute]] (öznitelik) mekanizması, kod hakkında ek bilgi sağlayarak derleyicinin uyarılar vermesine, belirli optimizasyonlar...

 
 
 
C++ Dilinde constinit

C++20'de tanıtılan önemli bir özellik `constinit`'dir; bu özellik, statik depolama süresine sahip değişkenlerin derleme zamanında...

 
 
 

Comments


bottom of page