const_cast 用法

const_cast 用法
语法:
const_cast<type-name>(expression);
作用:
1. 将const对象的地址赋给同类型的非const指针。例如:
   const int val = 100;
   int * pv = const_cast<int *>(&val);

但是,仍然无法通过这个非const指针pv来修改const对象val。所以,我觉得 const_cast 没有什么用。

2. 将非const对象的地址赋给同类型的const指针。例如:
   int val = 100;
   const int * pc = const_cast<const int *>(&val);
3. type-name 和 expression 的类型必须相同。

#include<cstdio>
int main()
{
  // assign address of "int object" to "int *" pointer.
  {
    int val_1 = 12;
    int *ptr_1 = const_cast<int *>(&val_1);
    *ptr_1 += 100;
    printf("val_1 = %d\n", val_1);
  }
  // assign address of "const int object" to "int *" pointer.
  {
    const int val_2 = 34;
    int *ptr_2 = const_cast<int *>(&val_2);
    *ptr_2 += 100;
    printf("val_2 = %d\n", val_2);
  }
  // assign address of "int object" to "const int *" pointer.
  {
    int val_3 = 56;
    const int *ptr_3 = const_cast<const int *>(&val_3);
    //*ptr_3 += 100; //error: assignment of read-only location ‘* ptr_3’
    printf("val_3 = %d\n", val_3);
  }
  // assign address of "const int object" to "const int *" pointer.
  {
    const int val_4 = 78;
    const int *ptr_4 = const_cast<const int *>(&val_4);
    //*ptr_4 += 100; error: assignment of read-only location ‘* ptr_4’
    printf("val_4 = %d\n", val_4);
  }
  // assign address of "const int object" to "char *" pointer.
  {
    const int val_5 = 78;
    //char *ptr_5 = const_cast<char *>(&val_5); error: invalid const_cast from type ‘const int*’ to type ‘char*’
    //*ptr_5 += 100; error: assignment of read-only location ‘* ptr_5’
    printf("val_5 = %d\n", val_5);
  }
}

测试结果:
[email protected]:~/project/CppPrimerPlus/Chapter 15$ ./a.out
val_1 = 112
val_2 = 34
val_3 = 56
val_4 = 78
val_5 = 78

时间: 2024-11-13 04:19:21

const_cast 用法的相关文章

【转】C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

原文链接:http://blog.csdn.net/bzhxuexi/article/details/17021559 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被

【c++程序】static_cast和const_cast用法

#include<iostream> using namespace std; #include<cstdlib>//标准c++不带.h,说明来自c语言 //static_cast,const_cast,reinterpret_cast,dynamic_cast强制类型转换 //const_cast用于临时去掉const.volatile限制 int main() { //int n=3.21; int m=static_cast<int>(3.2); int *p=s

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast(dynamic_cast还支持交叉转换,const_cast将一个类的const、volatile以及__unaligned属性去掉)

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型

const_cast,static_cast,dynamic_cast,reinterpret_cast的区别

C++继承了C中的隐式和显式转换的方式.但这种转换并不是安全和严格的, 加上C++本身对象模型的复杂性,C++增加了四个显示转换的关键字.(C++是强类型语言) 经过编码测试,小结如下: const_cast:仅用于去掉完全同类型的const,volatile约束,不能含有任何其它类型的转换,若不含约束也可以相当于没转换static_cast:使用类型可在继承的方向上向上或向下转换,不进行安全检查. 子类转父类,值.引用.指针形式均可,其中指针还可以是常量 父类转子类,值不可以,引用和指针均可,

static_cast, dynamic_cast, const_cast探讨

C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159;ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int *pi = 0; // 0被转化为int

static_cast, dynamic_cast, const_cast

[C++专题]static_cast, dynamic_cast, const_cast探讨 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为"标准转换",包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//ival被提升为doubl

【C++专题】static_cast, dynamic_cast, const_cast探讨

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. 1 int ival = 3; 2 double dval = 3.14159; 3 4 ival + dval;//ival被提升为double类型 2)一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型 int

C++之static_cast, dynamic_cast, const_cast

转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型. int ival = 3;double dval = 3.14159; ival + dval;//iva

C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast

在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换(3)避免使用reinterpret_cast和老式的强制类型转换操作符通常,隐式的类型转换会导致警告,需要重视这些警告,并使用显式的类型转换代替,例如static_cast代替一些算术类型转换. 在C++中,对象的类型通常有如下几种:(一)内置类型,如int ,bool ,枚举类型等(二)自定义类型