c++中四种类型转换

reinterpret_cast<目标类型>(原类型变量)//重解释类型转换
dynamic_cast<new_type>(expression)//动态类型转换
static_cast<new_type>(expression)//静态类型转换
const_cast<new_type>(expression)//返回一个指向非常量的指针

1.const_cast:常量指针被转化成非常量的指针,并且仍然指向原来的对象;常量引用被转换成非常量的引用,并且仍然指向原来的对象;

    const int a = 100;
    const int* p1 = &a;
    *p1 = 200; // ERROR
    int* p2 = const_cast<int*> (p1);
    *p2 = 200; // OK
   class A{};
   const A *a = new A;
   A *b= const_cast<A*> (a);
   A &c= const_cast<A&> (*a);

2. 动态类型转换:用在具有多态性的父子类指针或引用之间。动态类型转换是站在指针指向的对象的角度进行检查,编译总没错误,但是在在执行阶段,会以返回空指针的方式提示失败,如果是引用则抛出异常,被系统捕获然后杀死进程,这种转换形式是最安全的

3. 静态类型转换:如果在目标类型和源类型之间某一个方向上可以做隐式类型转换,那么在两个方向上都可以做静态类型转换。反之如果在两个方向上都不能做隐式类型转换,那么在任意一个方向上也不能做静态类型转换。静态类型转换是站在指针类型的角度进行检查,这个过程是在编译阶段进行的。

4. 重解释类型转换:在不同类型的指针或引用之间做类型转换,以及在指针和整型之间做类型转换。无论编译阶段还是执行阶段都不会进行类型检查,只是负责把一种类型转成另一种类型,这种转换形式最危险的。

#include <iostream>
using namespace std;
class A { virtual void foo (void) {} };
class B : public A {};
class C : public B {};
class D {};
int main (void) {
	B b;
	A* pa = &b;
	cout << pa << endl;
	cout << "--------  动态转换dc--------" << endl;
	// pa指向B对象,所以成功
	B* pb = dynamic_cast<B*> (pa);
	cout << pb << endl;
	// pa没有指向C对象,失败,安全
	C* pc = dynamic_cast<C*> (pa);
	cout << pc << endl;
	A& ra = b;
	try {
		C& rc = dynamic_cast<C&> (ra);
	}
	catch (exception& ex) {
		cout << "类型转换失败:" << ex.what ()
			<< endl;
		// ...
	}
	// pa没有指向D对象,失败,安全
	D* pd = dynamic_cast<D*> (pa);
	cout << pd << endl;

	cout << "-------- 静态转换sc --------" << endl;
	// B是A的子类,所以成功
	pb = static_cast<B*> (pa);
	cout << pb << endl;
	// C是A的孙子类,成功,危险!
	pc = static_cast<C*> (pa);
	cout << pc << endl;
	// D不是A的后裔,失败,安全
//	pd = static_cast<D*> (pa);
//	cout << pd << endl;

	cout << "-------- 重解释rc --------" << endl;
	// 无论在编译期还是在运行期都不做检查,危险!
	pb = reinterpret_cast<B*> (pa);
	cout << pb << endl;
	pc = reinterpret_cast<C*> (pa);
	cout << pc << endl;
	pd = reinterpret_cast<D*> (pa);
	cout << pd << endl;
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-01 11:03:41

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

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

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

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

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

c++的四种类型转换

C++中四种类型转换方式 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比如你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成指向一个派生类对象的指针,这两种转换之间的差别是巨大的,但是传统的c语言风格的类型转换没有区分这些.还有一个缺点就是,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++引用,常量优化,四种类型转换符

变量引用是变量的别名,常量引用要加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++四种类型转换操作符简要总结

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

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

Linux中四种进程或线程同步互斥控制方法

原文地址:http://blog.itpub.net/10697500/viewspace-612045/ 一.Linux中 四种进程或线程同步互斥的控制方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. 2.互斥量:为协调共同对一个共享资源的单独访问而设计的. 3.信号量:为控制一个具有有限数量用户资源而设计. 4.事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始. 二.临界区(Critical Section) 保证在某一时刻只有一个线程

jsp中四种范围的使用

///////////////////////////jsp中四种范围中的值的获取////////////////////////////////在pageContext,request,session,application四种范围中设置setAttribute()时:1.pageContext:pageContext.setAttribute(),只能在其本页面中取得值,pageContext.getAttribute() 2.request:request.setAttribute(),在