Giriş
Yazının özeti şöyle
1. explicit constructor
explicit Constructor yazısına taşıdım.
2. explicit metod
Bu özellik C++11 ile geliyor. explicit conversion metodların imzasında da kullanılabilir. Dönüşüm Operatörleri - Conversion Operator yazısında da explicit metod konusu mevcut.
Elimizde şöyle bir sınıf olsun
Elimizde 2 sınıf olsun. A int'e çevrilebilse bile B çevrilemeyeceği için aşağıdaki kod derlenmez.
Elimizde şöyle bir sınıf olsun
f çağrısı ise operator void*() metodunun çağrılmasını sağlar.
f çağrısının operator bool () metodunu çağırmasını sağlamak için şöyle yaparız.
Yazının özeti şöyle
explicit class_name ( params ) (1)
explicit operator type ( ) (since C++11) (2)1) specifies that this constructor is only considered for direct initialization (including explicit conversions)2) specifies that this user-defined conversion function is only considered for direct initialization (including explicit conversions)
1. explicit constructor
explicit Constructor yazısına taşıdım.
2. explicit metod
Bu özellik C++11 ile geliyor. explicit conversion metodların imzasında da kullanılabilir. Dönüşüm Operatörleri - Conversion Operator yazısında da explicit metod konusu mevcut.
Örnek2) A conversion function may beexplicit
[...]
[...]
5) Conversion functions can bevirtual
.
Elimizde şöyle bir sınıf olsun
struct A
{
virtual explicit operator bool() const
{
return true;
}
};
Bu durumda conversion operator static_cast ile çağrılır.A a;
bool b = static_cast<bool>(a);
ÖrnekElimizde 2 sınıf olsun. A int'e çevrilebilse bile B çevrilemeyeceği için aşağıdaki kod derlenmez.
struct A {
operator int() const {
// for simplicity, just return fixed value
return 1;
}
};
struct B {
explicit operator int() const { return 2;
}
};
A a;
B b;
bool x = (a < b); // does not work
ÖrnekElimizde şöyle bir sınıf olsun
class A
{
public:
explicit operator bool() const
{
std::cout << "operator bool" << std::endl;
return true;
}
operator void*() const
{
std::cout << "operator void*" << std::endl;
return 0;
}
};
Bu sınıfı şöyle kullanalım.void f(bool valid)
{
std::cout << "f called " << valid << std::endl;
}
int main(int argc, char *argv[])
{
A a;
if(a)
std::cout << "if a" << std::endl;
f(a);
return 0;
}
if cümlesi operator bool () metodunun çağrılmasını sağlar.f çağrısı ise operator void*() metodunun çağrılmasını sağlar.
f çağrısının operator bool () metodunu çağırmasını sağlamak için şöyle yaparız.
f(static_cast<bool>(a));
Hiç yorum yok:
Yorum Gönder