1 Ağustos 2017 Salı

explicit modifier

Giriş
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.
2) A conversion function may be explicit [...]
[...]
5) Conversion functions can be virtual.
Örnek
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);
Örnek
Elimizde 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
Örnek
Elimizde şö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