static_cast:干杂活的,那三个都有各自的专有用途,那三个不做的都由这个转型符来做,只要它能做的,用C语法的强制类型转换运算符也一定能够完成;但话又说回来了,C强制类型转换能做的,它可不一定都能做,比如去除const性。
此外在这里声明一点,一般人都不会清楚都不会注意到的一点,就是四个之中只有它可以用于非指针非引用类型的转换,其他三个运算符基本上都是专门和指针或者引用打交道的。
const_static:去除“指针”或“引用”的const、volatile、__unaligned性。很多人都以为用这个运算符就可以让const这么“固若金汤”的东西“形同虚设”,实则不然,本质上它能做的也就仅仅是为你剥去一层虚假的外壳,如果“被指向”或“被引用”的东西本身就是const的,那任凭你费多大力气都是徒劳的。一般它都是用在这样的一套逻辑中:
int a=34;const int * pcint=&a;int *pint=const_cast<int*>(pcint);*pint=0;这样就修改了本来是const的指针《该指针要求不能修改它指向的东东》,这里如果改为const int a=34;那么虽然编译依然能通过,运行依然OK,但是实际上当你用*pint来修改时,你会得到修改后的值为:a依然为34;而*pint确实为0了,但有趣的是此时pint=&a依然成立,虽然pint指向a,但是取出它的值却不等于a了。至此,希望大家今后不要再误用const_cast了。
dynamic_cast:用精炼的语言概括,就是专门用于面向对象中的down cast的。但是有三点是前提:第一,必须用于类和子类之间的转换;第二,必须用于指针或引用类型的转换;第三,基类必须有虚函数。
reinterpret_cast:用于对指针的重新包装,也就是指针类别之间的转化,除此之外,还可以用于指针类型和unsigned int类型之间的转化。
一些static_cast const_cast
时间: 2024-10-23 11:46:21
一些static_cast const_cast的相关文章
C++ static_cast const_cast dynamic_cast 和reinterpret_cast的区别
1.static_cast Operator The expression static_cast < type-id > ( expression ) converts expression to the type of type-id based solely on the types present in the expression. No run-time type check is made to ensure the safety of the conversion. Synta
c++强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
static_cast <typeid>(exdlvssion) static_cast 很像 C 语言中的旧式类型转换.它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户自定义类型转换操作符的类型转换,还能在存有继承关系的类之间进行转换(即可将基类转换为子类,也可将子类转换为基类),还能将 non-const对象转换为 const对象(注意:反之则不行,那是const_cast的职责.). double d = 3.14159265; int i = static_cast&
C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用
C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a). C++类型转换分为隐式类型转换和显示类型转换. 隐式类型转换又称为标准转换,包括以下几种情况: (1).算术转换:在混合类型的算术表达式中,最宽的数据类型成为目标转换类型: (2).一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型: (3).将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型: (4).从一个函数返回一个表达式,
C++ 转型操作符 【1】static_cast 和const_cast
[c++转型操作符] goto语句一直被视为程序设计上的"贱民",低阶转型动作它有的一拼,虽然它任然能够苟延残喘,不过,旧式的C转型方式并非是唯一选择. 旧式转型的语法结构: 由一对小括号加上一个对象名称(标识符)组成,而小括号和对象名称在C++的任何地方都能够被使用,因此,我们简直无法回答最基本的转型相关问题"这个程序张有使用过任何转型动作吗?" <span style="font-size:18px;">(type)express
【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、const_case、dynamic_cast
dynamic_cast:通常在基类和派生类之间转换,使用到RTTI(Runtime Type Information)在运行时判断转换是否正确,如不正确将抛出异常. const_cast:主要针对const和volatile的转换. static_cast:一般用于基本数据类型之间的转换转换,no run-time check,编译时判断. reinterpret_cast:用于进行没有任何关联类型之间的转换,比如一个字符指针转换为一个整形数. C++通过引进四个新的类型转换操作符克服了C
C++拾遗--name_cast 显式类型转换
C++拾遗--name_cast 显式类型转换 前言 C++中提供了四种显式的类型转换方法:static_cast,const_cast,reinterpret_cast,dynamic_cast.下面分别看下它们的使用场景. 显式类型转换 1.staitc_cast 这是最常用的,一般都能使用,除了不能转换掉底层const属性. #include <iostream> using namespace std; int main() { cout << "static_c
《More Effective C++》读书笔记
http://www.cnblogs.com/tianyajuanke/archive/2012/11/29/2795131.html 一.基础议题(Basics) 1.仔细区别 pointers 和 references 当一定会指向某个对象,且不会改变指向时,就应该选择 references,其它任何时候,应该选择 pointers. 实现某一些操作符的时候,操作符由于语义要求使得指针不可行,这时就使用引用. 二者之间的区别是:在任何情况下都不能用指向空值的引用,而指针则可以:指针可以被重新
C++中4种强制类型转换
不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类