Giriş
Açıklaması şöyle.
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.
Örnek - const'luğu kaldırmak
Şöyle yaparız.
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.
Açıklaması şöyle
Şöyle yaparız.
Açıklaması şöyle.
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.
Şu kod const int'i değiştirmeye çalıştığı için hatalı.
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
}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)) {...}
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();
}Şöyle yaparız.
volatile SomeType x;   // const qualifier may also be used here
 SomeType &something = const_cast<SomeType &>(x);Açıklaması şöyle.
Örnek6.7.3 Type qualifiers5 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.
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;
}Ş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
}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
}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