文档章节

C++的类型转换

沙米笔记
 沙米笔记
发布于 2016/06/26 12:57
字数 903
阅读 88
收藏 1

1、类型转换名称和语法

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:

    TYPE b = (TYPE)a   

    C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。

   static_cast             静态类型转换。如int转换成char

           reinterpreter_cast 重新解释类型

      dynamic_cast       命 名上理解是动态类型转换。如子类和父类之间的多态类型转换。

           const_cast           字面上理解就是去const属性。

    4种类型转换的格式:

    TYPE B = static_cast<TYPE> (a)  

2、类型转换一般性介绍

    4中类型转化介绍  

  1)static_cast<>() 静态类型转换,编译的时c++编译器会做类型检查;

        基本类型能转换 但是不能转换指针类型

    2)若不同类型之间,进行强制类型转换,用reinterpret_cast<>() 进行重新解释

    3)dynamic_cast<>(),动态类型转换,安全的基类和子类之间转换;运行时类型检查 (C++特有的)

    4)const_cast<>(),去除变量的只读属性(C++特有的),变量的类型必须是指针,指针指向的内存空间可被修改

    一般性结论

    C语言中  能隐式类型转换的,在c++中可用 static_cast<>()进行类型转换。因C++编译器在编译检查一般都能通过;

    C语言中不能隐式类型转换的,在c++中可以用 reinterpret_cast<>() 进行强行类型 解释。

    static_cast<>()和reinterpret_cast<>() 基本上把C语言中的 强制类型转换给覆盖

    reinterpret_cast<>()很难保证移植性。

3、典型案例

代码中包含了4中类型转化的实例,以及注意点。  

#include<iostream>
using namespace std;

class Animal
{
public:
	virtual void action()
	{
		cout<<"the action is animal's "<<endl;
	}
};

class Dog:public Animal
{
public:
	virtual void action()
	{
		cout<<"the action is dog's "<<endl;
	}

	void doSwim()
	{
		cout<<"the dog is swimming..."<<endl;
	}
};

class Cat:public Animal
{
public:
	virtual void action()
	{
		cout<<"the action is cat's "<<endl;
	}

	void doTree()
	{
		cout<<"the cat is claming tree..."<<endl;
	}
};

class Desk
{
public:
	void action()
	{
		cout<<"this is Desk, not belong Animal"<<endl;
	}
};

void ObjPlay(Animal *animl)
{
	animl->action();
	Dog *dog = dynamic_cast<Dog *>(animl);
	if(dog!=NULL)  //判断是不是dog
	{
		dog->action();
		dog->doSwim();
	}

	Cat *cat = dynamic_cast<Cat *>(animl);
	if(cat!=NULL)	//判断是不是cat
	{
		cat->action();
		cat->doTree();
	}
	cout<<"func ObjPlay is exit!!!\n"<<endl;
}

//典型用法 把形参的只读属性去掉
void Opbuf(const char *p)
{
	cout << p << endl;
	//char *p2 = p;		err:const char *不能初始化为char *
	//p[0] = 'b';		err:必须是可修改的左值
	char *p2 = const_cast<char*>(p);  //去除只读的属相
	p2[0] = 'b';
	cout << p << endl;
}

int main()
{
	//静态类型转化 static_cast<>()
	double d = 3.14159;
	int  i1,i2;
	i1 = d;		//C中的隐式类型转化
	i2 = static_cast<int>(d);  //C++中的静态类型转化
	cout<<"C中类型转化:"<<i1<<endl;
	cout<<"C++中类型转化:"<<i2<<endl;


	//重新解释类型reinterpret_cast<>()
	char *p  = "abcd";
	int *p1 = NULL;
	int *p2 = NULL;
	p1 = (int *)p;	//C中强制类型转化
	//p2 = static_cast<int *>(p);    编译报错,类型转化错误,静态类型不能转化指针
	p2 = reinterpret_cast<int *>(p);	//C++中的重新解释类型
	cout<<"C中类型转化"<<hex<<*p1<<endl;
	cout<<"C++中类型转化:"<<hex<<*p2<<endl;

	//动态类型转换 dynamic_cast<>()
	Animal an;
	Animal *pAn = &an;
	ObjPlay(pAn);

	Dog dog;
	Dog *pDog = &dog;
	ObjPlay(pDog);

	Cat cat;
	Cat *pCat = &cat;
	ObjPlay(pCat);

	Desk desk;
	Desk *pDesk = &desk;
	//Animal *pAn = dynamic_cast<Animal*>(pDesk); 不同的基类指针之间不能相互转化,安全

	//去除变量的只读属性,const_cast<>(),此类型必须是指针
	char buf[100] = "aaaaaaaaaaaa";
	//Opbuf(buf);
	//要保证指针所执行的内存空间能修改才行 若不能修改 还是会引起程序异常
	//Opbuf("dddddddddddsssssssssssssss");

	system("pause");
	return 0;
}

 

 

 

 

© 著作权归作者所有

沙米笔记
粉丝 29
博文 43
码字总数 45024
作品 0
深圳
程序员
私信 提问
C++笔记(一)20110223

近日,公司准备用C++来做个类似openmeetings的软件。C++只是在学校时学习了,当当购了三本《Visal C++ 入门经典(第五版)》、《深入浅出MFC》、《Visaual C++ 音频你/视频处理技术及工程实践...

钟小华
2011/02/23
425
0
FFLIB之FFLUA——C++嵌入Lua&扩展Lua利器

摘要: 在使用C++做服务器开发中,经常会使用到脚本技术,Lua是最优秀的嵌入式脚本之一。Lua的轻量、小巧、概念之简单,都使他变得越来越受欢迎。本人也使用过python做嵌入式脚本,二者各有特...

知然
2013/01/27
0
0
C++ 模板惯用法

原文:C++ 模板惯用法 作者:Breaker 关于 C++ 模板编程的惯用法,note-to-self + keynote + idiom case + cross-reference 式笔记 目录 模板语法 模板惯用法示例 堆栈上分配 编译优化的开关...

晨曦之光
2012/05/23
1.5K
0
C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

C++强制类型转换:staticcast、dynamiccast、constcast、reinterpretcast 1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换...

shzwork
2019/03/12
12
0
【整理】为什么在C/C++中总是对malloc的返回值进行强制转换

============= 文章1 ================ 首先要说的是,使用 malloc 函数,请包含 stdlib.h(C++ 中可以是 cstdlib),而不是 malloc.h 。因为 malloc.h 从来没有在 C 或者 C++ 标准中出现过!...

摩云飞
2013/05/07
332
0

没有更多内容

加载失败,请刷新页面

加载更多

今日头条技术架构分析,看这篇就对了!

点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Anywhere, it is a good in the past, recall the number of times many, all would be ligh......

吧主
6分钟前
20
0
影响K8S Pod分配和调度策略的两大关键特性

在Kubernetes中有一个最复杂的调度器可以处理pod的分配策略。基于在pod规范中所提及的资源需求,Kubernetes调度器会自动选择最合适的节点来运行pod。 但在许多实际场景下,我们必须干预调度过...

RancherLabs
9分钟前
25
0
Linux笔记

Linux常用命令之chmod修改文件权限777和754 示例:chmod 777 /etc/squid 运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。...

owenzhang24
13分钟前
11
0
教你如何在CentOS7系统上安装postgreSQL11

本文教你如何在CentOS7系统上安装postgreSQL11。 1.添加PostgreSQL Yum存储库 sudo yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-......

Linux就该这么学
20分钟前
37
0
欧盟将禁止公共场所人脸识别:谷歌支持,微软反对

   来源:新浪、VB   近日,彭博社披露的一份欧盟人工智能“白皮书”草案显示,欧盟计划对人工智能开发者提出具有法律约束力的新要求,以确保现代科技的开发和使用符合道德规范。    ...

水果黄瓜
23分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部