top of page

C++ Dilinde Conversion Constructor

  • Writer: Yusuf Hançar
    Yusuf Hançar
  • Aug 3, 2023
  • 2 min read

Updated: Aug 5, 2023

C++ dilinde kurucu işlevlerden yani constructor yapısından bahsetmiştik. Sınıfların özel üye fonksiyonları (default, copy, move) ve kullanım senaryolarını temel seviyede örneklendirerek inceledik. Bu yazıda bir veri türünün otomatik olarak başka bir veri türüne dönüştürülmesini sağlayan conversion constructor incelemesi yapacağız. Nesneler otomatik olarak başka bir sınıf türüne dönüşme ihtiyacı duyduğunda bu kurucu işlev çağrısı gerçekleşmektedir. Bu sayede uygun olan data type kullanımına olanak tanınmaktadır ve programcı bunu kendisi tanımlamaktadır. Derleyiciler uygun dönüşüm yapılması ihtiyacı doğarsa otomatik çağrı yapacaklardır. Çoğunlukla tek parametreli olurlar ama çok parametreli conversion constructor tanımlanabilmektedir. Otomatik tür dönüşümü nerede yapılacaksa o sınıf içerisinde yazılması gerekir. Otomatik olarak dönüşüme izin verildiğinin üzerine oldukça konuştuk yani explicit olmayarak bu otomatikleşme sağlanabilmektedir. Örneklerle bunu pekiştirerek devam edelim...


class SmartCode {
public :
};

int main() 
{
    SmartCode sc;
    sc = 23;
}
*****************************
AÇIKLAMA: atama için uygun operator bulunmamaktadır. Bunu derleyicinin nasıl sağladığını görmek için sonraki örnek pekiştirici olacaktır.
*****************************
CEVAP: syntax error
*****************************
class SmartCode {
public :
    SmartCode() = default;
    SmartCode(int);
};

int main() 
{
    SmartCode sc;
    sc = 23;
}
*****************************
AÇIKLAMA: burada derleyici "sc.operator = SmartCode{23}" dönüşümünü otomatik olarak SmartCode(int) conversion constructor üzerinden yaptı. Derleyici bu şekilde ihtiyaç duyulan yerde bu kurucu işleve çağrı yapacaktır.
NOT : default constructor olmadığında hata vereceği unutulmamalıdır!
*****************************
CEVAP: legal
*****************************
class SmartCode {
public :
    SmartCode() = default;

    SmartCode(int val)
    { 
        cout << "SmartCode(int)" << val << endl; 
    } 
};

void smart_func(SmartCode m)
{}

int main() 
{
    smart_func(23);
}
*****************************
AÇIKLAMA: derleyici tarafından conversion constructor sayesinde "smart_func{23}" şeklinde geçici nesne oluşturularak otomatik çağrı yapılmaktadır.
*****************************
CEVAP: legal
*****************************
class SmartCode {  
public :  
    SmartCode() = default;  

    SmartCode (int val) 
    {  
        cout <<  "SmartCode(int) = " << val << endl;  
    }  
};  

int main() 
{ 
    SmartCode sc; 

    bool flag = false;               
    sc = flag; 
}
*****************************
AÇIKLAMA: bool türünden int türüne, int türden de SmartCode sınıfı türüne dönüşüm legaldir. User Defined Conversion olarak tanımlanan durumdur.
*****************************
CEVAP: legal
*****************************
int main() 
{
    std::string sc_str{ "smart" };
    sc_str = "code";
}
*****************************
AÇIKLAMA: "code" yazısı "const char*" türündendir. string sınıfına ait "const char*" parametreli kurucu işlev olduğu için bu atama legaldir.
*****************************
CEVAP: legal
*****************************
class Meter {
private:
    int m_len;

public:
    Meter(int len) : m_len(len) {}

    int get_len() const 
    {
        return m_len;
    }
};

class CmMeter {
private:
    int m_len;

public:
    CmMeter(int len) : m_len(len) {}

    CmMeter(Meter meter_len) : m_len(meter_len.get_len() * 100) {}

    int get_len() const 
    {
        return m_len;
    }
};

int main() 
{
   Meter mt(10);
   CmMeter cm_mt = mt;         // conversion ctor call

   std::cout << "meter      : " << mt.get_len()    << std::endl;
   std::cout << "centimeter : " << cm_mt.get_len() << std::endl;

   return 0;
}
*****************************
AÇIKLAMA : conversion constructor ile metreden santimetreye dönüşüm ihtiyacı olan yerde derleyici otomatik çağrı yaptı.
*****************************
CEVAP: 
meter      : 10
centimeter : 10000
*****************************

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