25 Haziran 2020 Perşembe

const_cast

Giriş
Açıklaması şöyle.
A const_cast is used either to remove or to add the "const-ness" of an object.
const_cast nerede kullanılır

1. Const Olmayan Nesnenin Const Görünümünden Const Özelliği Kaldırmak İçin
Tanımlanırken const olarak tanımlanmayan değişkenlerde kullanılır. Bu değişkenler metodlara const olarak geçiliyor olabilir. Bazı özel durumda const özelliğini geçici bir sürü kaldırıp üzerinde çalışabiliriz.

2. Const Olan Nesne'den Const Özelliği Kaldırmak İçin
Ancak nesne salt okunur olmalıdır. Değiştirilemez. Açıklaması şöyle.
Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.

Örnek - const'luğu kaldırmak
Şöyle yaparız.
void ChangeValue(const int i) {
  int* p = const_cast<int*>(&i);
  *p = 22;
  std::cout<<i; //Here the value changes to 22
}

int main() {
  int i = 5;
  ChangeValue(i);
  std::cout  << i
}
Örnek - const'luğu eklemek
const olmayan bir nesneyi const olarak dolaşmak için şöyle yaparız. const_cast kullanmazsak dönen iterator'ler const olmaz. Ancak bu kod ile const iterator dönmesini sağlarız.
for (const auto &ab: const_cast<MyClass const&>(myc)) {...}
const_cast  nesne const olsa veya olmasa da kullanılabilir
Açıklaması şöyle
If an object is not const, using const_cast<> to remove constness makes no difference.
Şöyle yaparız.
struct X {
  void foo ();
};

template<typename T>
void call_foo (T& t)  //T is either `X` or `const X`
{
  X& x = const_cast<X&>(t);
  x.foo();
}
const_cast volatile özelliği kaldırır
Şöyle yaparız.
volatile SomeType x;   // const qualifier may also be used here

 SomeType &something = const_cast<SomeType &>(x);
const_cast tanımsız (undefined) davranışa sebep olabilir
Açıklaması şöyle.
6.7.3 Type qualifiers
5 If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.
Örnek
Aşağıdaki örnekte değişken read-only segment içinde yaratılıyor ve biz bu değerini değiştirmeye çalışyoruz. Kod derlenir ancak istenilen sonuç alınamaz.
int main() {
  const int i = 5;
  int* p = const_cast<int*>(&i);
  *p = 22;
  std::cout<<i;
  return 0;
}
Örnek
Şu kod const int'i değiştirmeye çalıştığı için hatalı.
int main()
{
  using std::cout;
  #define endl '\n'
  const int i = 123;
  const int & ri = i;
  const_cast<int&>(ri) = 321;
  cout << "i: " << i << endl;  // value in 'i' is 123
}
Şu kod da const int'i değiştirmeye çalıştığı için hatalı
int main()
{
  using std::cout;
  #define endl '\n'
  const int i = 123;
  const int * ri = &i;
  *const_cast<int*>(ri) = 321;
  cout << "i: " << i << endl;  // value in 'i' is 123
}
Şu kod da const int*'ı değiştirmeye çalıştığı için çalışıyor görünse bile hatalı
int main()
{
  using std::cout;
  #define endl '\n'
  const int * ip = new int(123);
  const int * ptr = ip;
  *const_cast<int*>(ptr) = 321;
  cout << "*ip: " << *ip << endl;  // value of *ip is changed to 321
}


Hiç yorum yok:

Yorum Gönder