C++四种类型转换

C++有4种类型转换,reinterpret_cast, static_cast, dynamic_cast 和 const_cast

reinterpret_cast


reinterpret_cast 可以将一个指针转换为任意其它类型的指针或int,或反之亦可。

可以在互不相关的类之间进行指针转换,它只是简单地将一个指针的二进制数据复制到另一个指针,对指针指向的内容不做任何检查或转换。

class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B*>(a);

static_cast


static_cast
可以执行所有能够隐含执行的类型转换,以及它们的反向操作(即使这种方向操作是不允许隐含执行的)。所谓能够隐含执行的类型转换,简单点说就是合法的转换(不合法的转换比如:指向父类对象的父类指针转为子类指针;两个不相关的类的转换等)

class Base {};
class Derived: public Base {};
Base* a = new Base;
Derived* b = static_cast<Derived*>(a);

dynamic_cast


dynamic_cast 完全被用来进行指针的操作。它可以用来进行任何可以隐含进行的转换操作以及它们被用于多态类情况下的合法方向操作。


class Base { virtual void dummy(){}; }; //Base必须有虚函数才能保证多态,编译器会检查Base是否有虚函数
class Derived : public Base { };
Base* b1 = new Derived;
Base* b2 = new Base;
Derived* d1 = dynamic_cast<Derived*>(b1); // succeeds (父类指针指向子类对象,该指针可以转为子类指针)
Derived* d2 = dynamic_cast<Derived*>(b2); // 编译通过!但returns NULL (父类指针指向父类对象,该指针不可转为子类指针)

const_cast


设置或取消常量属性


class A {public:void hello(){}};
A b;
const A a = b; //const 声明时必须初始化
//a.hello(); //error, because a is a const object
A *a2 = const_cast<A*>(&a); //指针
a2->hello(); //ok
A& a3 = const_cast<A&>(a); //常量
a3.hello(); //ok

C++四种类型转换,布布扣,bubuko.com

时间: 2024-08-02 06:59:09

C++四种类型转换的相关文章

C++ Primer笔记2_四种类型转换_异常机制

1.类型转换 命名的强制类型转换: 有static_cast.dynamic_cast.const_cast.reinterpret_cast static_cast: 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换. 可以将void*指针转换为某一类型的指针 可以将基类指针强制转换为派生类指针,但是不安全. 无法将const转化为nonconst,这个只有const_cast才可以办得到 举例:

c++的四种类型转换

C++中四种类型转换方式 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成

C++引用,常量优化,四种类型转换符

变量引用是变量的别名,常量引用要加const,引用与被引用的东西是同一样. #include <string> #include <ctype.h> #include <vector> #include <iostream> #include <fstream> // using declarations states our intent to use these names from the namespace std using names

[转]C++中四种类型转换符的总结

C++中四种类型转换符的总结 一.reinterpret_cast用法:reinpreter_cast<type-id> (expression)    reinterpret_cast操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,即二进制值没有变.例如: int n=9; double d= reinterpret_cast< double > (n); 在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复

c++四种类型转换操作符简要总结

1.  static_cast<target>(expression) 可用于存在继承关系的类指针/引用之间的向上向下转换.执行向下转换时没有安全检查(区别于dynamic_cast),所以如果实际类型与目标类型不符合,编译虽然可以通过,但运行时的后果未定义. void*指针转换为实际的指针 其他基本类型的隐式转换以及反方向的转换,如:int <-> double 2.  dynamic_cast<target>(expression) 只能用于target为类指针或者

C++四种类型转换方式。

类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序

C++四种类型转换总结

const_cast,字面上理解就是去const属性. static_cast,命名上理解是静态类型转换.如int转换成char. dynamic_cast,命名上理解是动态类型转换.如子类和父类之间的多态类型转换. reinterpret_cast,仅仅重新解释类型,但没有进行二进制的转换. 4种类型转换的格式,如:TYPE B = static_cast(TYPE)(a). const_cast 去掉类型的const或volatile属性. struct SA { int i; }; con

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

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

C++中四种类型转换方式

类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,c风格的转换不容易查找,他由一个括号加上一个标识符组成,而这样的东西在c++程序