delegating constructor
C++ 11'den önce bir constructor C#'taki gibi bir başka constructor metodunu çağıramazdı. Ancak C++11 ile bu durum değişti. Artık aşağıdaki gibi yapılabiliyor. Eğer derleyicimiz yeni değilse, mecburen ortak bir init() metodu yazmak gerekir.
Örnek
İstenirse std::move bile kullanılabilir. Şöyle yaparız.
Şöyle yaparız.
İki tane büyük faydası var.
1. Default Parametre Tanımlama Sağlaması Faydası
Bence en büyük faydası az parametre alan bir constructor tanımlayarak default parametreler ile çok parametre alan bir başka constructor'ın çağrılabilmesi.
Örnek
Şöyle yaparız. Elimizde 1 ile işaretli constructor olsun. 2 ile işaretli constructor'ı yazarak x parametresini girmekten kurtulmak mümkün.
Şöyle yaparız. Elimizde 2 ile işaretli constructor olsun. 1 ile işaretli constructor'ı yazarak default constructor'a sahip olmak mümkün.
Elimizde şöyle bir kod olsun. Burada public constructor, gcd() metodunu çağırarak private constructor metodumuzu tetikler.
Eğer en dıştaki constructor exception atarsa yine destructor çağrılır.
C++ 11'den önce bir constructor C#'taki gibi bir başka constructor metodunu çağıramazdı. Ancak C++11 ile bu durum değişti. Artık aşağıdaki gibi yapılabiliyor. Eğer derleyicimiz yeni değilse, mecburen ortak bir init() metodu yazmak gerekir.
Örnek
İstenirse std::move bile kullanılabilir. Şöyle yaparız.
SomeClass(const std::string&& _name) : name(_name) {}
SomeClass(const std::string& _name) : SomeClass(std::move(_name)
) {}
ÖrnekŞöyle yaparız.
ZfooName::ZfooName(int magoo)
: ZfooName()
{
fGoo = magoo;
}
Faydası Nedirİki tane büyük faydası var.
1. Default Parametre Tanımlama Sağlaması Faydası
Bence en büyük faydası az parametre alan bir constructor tanımlayarak default parametreler ile çok parametre alan bir başka constructor'ın çağrılabilmesi.
Örnek
Şöyle yaparız. Elimizde 1 ile işaretli constructor olsun. 2 ile işaretli constructor'ı yazarak x parametresini girmekten kurtulmak mümkün.
class Foo {
public:
Foo(char x, int y) {...} //1
Foo(int y) : //2
Foo('a', y) {...}
};
ÖrnekŞöyle yaparız. Elimizde 2 ile işaretli constructor olsun. 1 ile işaretli constructor'ı yazarak default constructor'a sahip olmak mümkün.
class UDPSocketTest : public SocketTest
{
public:
UDPSocketTest() : //1
UDPSocketTest(new SocketPool()) {}
// You should already have this constructor written:
UDPSocketTest(SockerPool *p) //2
SocketTest(p),
socketPool_(p)
{
}
~UDPSocketTest() {
}
private:
SocketPool* socketPool_;
};
ÖrnekElimizde şöyle bir kod olsun. Burada public constructor, gcd() metodunu çağırarak private constructor metodumuzu tetikler.
int gcd(int a, int b); // Greatest Common Divisor
class Fraction {
public:
// Call gcd ONCE, and forward the result to another constructor.
Fraction(int a, int b) : Fraction(a,b,gcd(a,b))
{
}
private:
// This constructor is private, as it is an
// implementation detail and not part of the public interface.
Fraction(int a, int b, int g_c_d)
{
...
}
};
2. Destructor'ın Çağrılmasını Sağlaması FaydasıEğer en dıştaki constructor exception atarsa yine destructor çağrılır.
Şöyle yaparız.if the non‐delegating constructor for an object has completed execution and a delegating constructor for that object exits with an exception, the object’s destructor will be invoked.
X(const A& x, const A& y)
: X{}
{
...
}
Şu kod default constructor'ın çalışmasını garanti eder.
: X{}
Eğer kendi constructor metodum içinde exception atılsa bile destructor metodum çalışır.
Hiç yorum yok:
Yorum Gönder