const_cast的用法

C++提供了四个转换运算符:

·        
const_cast <new_type> (expression)

·        
static_cast <new_type> (expression)

·        
reinterpret_cast <new_type> (expression)

·        
dynamic_cast <new_type> (expression)

它们有着相同的结构,看起来像是模板方法。这些方法就是提供给开发者用来进行指针和引用的转换的。

一、用法

const_cast<type_id> (expression)

该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

1
常量指针被转化成非常量的指针,并且仍然指向原来的对象;

2
常量引用被转换成非常量的引用,并且仍然指向原来的对象;

二、案例

class B

{

public:

B() { }

public:

int m_iNum;

};

void foo()

{

const B b1;

//b1.m_iNum = 100; //compile error

// 可以做如下转换,体现出转换为指针类型

B *b2 = const_cast<B*>(&b1);

// 或者左侧也可以用引用类型,如果对b2或b3的数据成员做改变,就是对b1的值在做改变

B &b3 = const_cast<B&>(b1);

b2->m_iNum = 200;    //fine

b3.m_iNum = 300;    //fine

}

int main( int argc, char * argv[] )

{

foo();

return 0;

}

上面代码可运行,不会报错,错误代码已经注释。去掉下面代码行的注释号后会报错,因为b1之不可修改。

使用const_cast可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。

时间: 2024-11-06 10:52:30

const_cast的用法的相关文章

C++中的四种类型转换运算符static_cast、dynamic_cast、const_cast和reinterpret_cast的使用

1.上一遍讲述了C语言的隐式类型转换和显示类型转换,C语言之所以增加强制类型转换,就是为了强调转换的风险性,但这种强调风险的方式是比较粗放了,粒度比较大,它并没有表明存在什么风险,风险程度如何. 2.为了使潜在风险更加细化,使问题追溯更加方便,使书写格式更加规范,C++ 对类型转换进行了分类,并新增了四个关键字来予以支持,它们分别是: 关键字 说明 static_cast 用于良性转换,一般不会导致意外发生,风险很低. const_cast 用于 const 与非 const.volatile

RTTI

RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. 编辑本段RTTI介绍 RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型: (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用. 面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知

mfc 类型间的强制转换

一. static_cast运算符 用法:static_cast < type-id > ( expression ) 该运算符把expression 转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有如下几种用法: ①用于类层次结构中基类和子类之间指针或引用的转换. 进行上行转换(把子类的指针或引用转换成基类表示)是安全的: ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保证. ③把空指针转换成目标类型的

Bill学C++ 第一季:const 详解

零.文章来由 打算将基础知识在看书的同时系统的整理一下,方便大家也方便自己.整理的知识尽量参照书本知识,比网上获取的资料有更高的可信度. 一.从 文字常量和常变量 开始 1.文字常量 程序中的特殊标识符或表达式,由于同时满足: (1)不可寻址(放在代码区) (2)值不可变 所以可视为文字常量.他们是 静态数组名.枚举变量.全局(静态变量)首地址.#define定义的常量. 整型文字常量: (1)前加0表示 八进制 (2)前加0x表示 十六进制 (3)后加L(推荐)或l,表示long类型 (4)后

c++ 基本使用

1 枚举 1 enum ShapeType 2 { 3 circle, 4 square, 5 rectangle 6 }; 7 8 int main() { 9 10 ShapeType shape = circle; 11 12 switch(shape) 13 { 14 case circle: 15 cout<<"ShapeType.circle"<<endl; 16 break; 17 case square: 18 cout<<"

RTTI (Run-Time Type Identification,通过运行时类型识别) 转

参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型: (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用. 面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知识.描述 R

【c++】static_cast, dynamic_cast探讨

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

const char * 转换为char*

可以用const_cast ????const char* aa = "this is a const string."; ????char* bb = const_cast<char*>(aa); ????return 0; ? 更多const_cast的用法如下: http://en.cppreference.com/w/cpp/language/const_cast

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指针.例如: