CC++数据类型的转换Word文档格式.docx
- 文档编号:16158369
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:14
- 大小:26.17KB
CC++数据类型的转换Word文档格式.docx
《CC++数据类型的转换Word文档格式.docx》由会员分享,可在线阅读,更多相关《CC++数据类型的转换Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
(2)赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
(3)函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
(4)函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
编程原则,请尽量不要使用隐式类型转换,即使是隐式的数据类型转换是安全的,因为隐式类型数据转换降低了程序的可读性。
2.显示数据类型转换
显示数据类型转换是显示指明需要转换的类型,首先考察如下程序。
#include<
iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
shortarr[]={65,66,67,0};
wchar_t*s;
s=arr;
wcout<
<
s<
endl;
getchar();
}
由于shortint和wchar_t是不同的数据类型,直接把arr代表的地址赋给s会导致一个编译错误:
errorC2440:
“=”:
无法从“short[4]”转换为“wchar_t”。
为了解决这种“跨度较大”的数据类型转换,可以说还用显示的“强制类型转换”机制,把语句s=arr;
改为s=(wchar_t*)arr;
就能顺利通过编译,并输出:
ABC。
强制类型转换在C语言中就已经存在,到了C++语言中可以继续使用。
在C风格的强制类型转换中,目标数据类型被放在一堆圆括号中,然后置于源数据类型的表达式前。
在C++语言中,允许将目标数据类型当做一个函数来使用,将源数据类型表达式置于一对圆括号中,这就是所谓的“函数风格”的强制类型转换。
以上两种强制转换没有本质区别,只是书写形式上略有不同。
即:
(T)expression//C-stylecast
T(expression)//function-stylecast
可将它们称为旧风格的强制类型转换。
在上面的程序中,可以用以下两种书写形式实现强制类型转换:
s=(wchar_t*)arr;
typedefwchar_t*LSPTR;
s=LSPTR(arr);
3.C++中新式类型转换
在C++语言中,增加了四中内置的类型转换操作符:
const_cast、static_cast、dynamic_cast和reinterpret_cast。
它们具有统一的语言形式:
type_cast_operator<
type>
(expresiion)。
下面分别介绍。
3.1const_cast
const_cast主要用于解除常指针和常量的const和volatile属性。
也就是说,把cosnttype*转换成type*类型或将consttype&
转换成type&
类型,但是要注意,一个变量本身被定义为只读变量,那么它永远是常变量。
const_cast取消的是对间接引用时的改写限制(即只针对指针或者引用),而不能改变变量本身的const属性。
如下面的语句就是错误的
constinti;
intj=const_cast<
int>
(i);
正确示例如下:
voidconstTest{
constinta=5;
int*p=NULL;
p=const_cast<
int*>
(&
a);
(*p)++;
cout<
a<
//输出6
}
程序正常运行,输出6。
3.2static_cast
static_cast相当于传统的C语言中那些“较为合理”的强制类型转换,较多的使用于基本数据类型之间的转换、基类对象指针(或引用)和派生类对象指针(或引用)之间的转换、一般的指针和void*类型的指针之间的转换等。
static_cast操作对于类型转换的合理性会作出检查,对于一些过于“无理”的转换会加以拒绝。
例如下面的转换:
doubled=3.14;
double*p=static_cast<
double*>
(d);
这是一种非常诡异的转换,在编译时会遭到拒绝。
另外,对于一些看似合理的转换,也可能被static_cast拒绝。
这时要考虑别的方法。
如下面的程序。
classA{
charch;
intn;
public:
A(charc,inti):
ch(c),n(i){}
};
Aa('
s'
2);
char*p=static_cast<
char*>
cout<
*p;
这个程序无法通过编译,就是说,直接将A*类型转换为char*是不允许的,这时可以通过void*类型作为中介实现转换。
修改后的程序如下。
void*q=&
a;
char*p=static_cast<
q);
这样,程序就可以通过编译,输出s。
可见,如果指针类型之间进行转换,一定要注意转换的合理性,这一点必须由程序员自己负责。
指针类型的转换以为这对原数据实体的内容的重新解释。
虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用。
其实这是很容易理解的,static决定的是一个变量的作用域和生命周期,比如:
在一个文件中将变量定义为static,则说明这个变量只能在本Package中使用;
在方法中定义一个static变量,该变量在程序开始存在直到程序结束;
类中定义一个static成员,该成员随类的第一个对象出现时出现,并且可以被该类的所有对象所使用。
对static限定的改变必然会造成范围性的影响,而const限定的只是变量或对象自身。
但无论是哪一个限定,它们都是在变量一出生(完成编译的时候)就决定了变量的特性,所以实际上都是不容许改变的。
这点在const_cast那部分就已经有体现出来。
在实践中,static_cast多用于类类型之间的转换。
这时,被转换的两种类型之间一定存在派生与继承的关系。
见如下程序。
classA{};
classB{};
A*pa;
B*pb;
Aa;
pa=&
pb=static_cast<
B*>
(pa);
改程序无法通过编译,原因是类A与类B没有任何关系。
综上所述,使用static_cast进行类型转换时要注意如下几点。
(1)static_cast操作符的语法形式是static_cast<
(expression),其中,expression外面的圆括号不能省略,哪怕expression是一个简单的变量。
(2)通过static_cast只能进行一些相关类型之间的“合理”转换。
如果是类类型之间的转换,源类型和目标类型之间必须存在继承关系,否则会得到编译错误。
(3)static_cast所进行的是一种静态转换,是在编译时决定的。
通过编译后,空间和时间效率实际上等价于C方式的强制类型转换。
(4)在C++中,只想派生类对象的指针可以隐式转换为指向基类对象的指针。
而要把指向积累对象的指针转换为指向派生类对象的指针,就需要借助static_cast操作符来完成,其转换的风险是需要程序员自己来承担。
当然使用dynamic_cast更为安全。
(5)static_cast不能转换掉expression的const、volitale、或者__unaligned属性。
3.3dynamic_cast
dynamic_cast是一个完全的动态操作符,只能用于指针或者引用间的转换。
而且dynamic_cast运算符所操作的指针或引用的对象必须拥有虚函数成员,否则出现编译错误。
原因是dynamic_cast牵扯到的面向对象的多态性,其作用就是在程序运行的过程中动态的检查指着或者引用指向的实际对象是什么以确定转换是否安全,而C++的类的多态性则依赖于类的虚函数。
具体的说,dynamic_cast可以进行如下的类型转换。
(1)在指向基类的指针(引用)与指向派生类的指针(引用)之间进行的转换。
基类指针(引用)转换为派生类指针(引用)为向下转换,被编译器视为安全的类型转换,也可以使用static_cast进行转换。
派生类指针(引用)转换为基类指针(引用)时,为向上转换,被编译器视为不安全的类型转换,需要dynamic_cast进行动态的类型检测。
当然,static_cast也可以完成转换,只是存在不安全性。
(2)在多重继承的情况下,派生类的多个基类之间进行转换(称为交叉转换:
crosscast)。
如父类A1指针实际上指向的是子类,则可以将A1转换为子类的另一个父类A2指针。
3.3.1dynamic_cast的向下转换
dynamic_cast在向下转换时(downcast),即将父类指针或者引用转换为子类指针或者引用时,会严格检查指针所指的对象的实际类型。
参见如下程序。
inti;
virtualvoidshow(){
"
classA"
A(){inti=1;
classB:
publicA{
intj;
voidshow(){
classB"
B(){j=2;
classC:
publicB{
intk;
classC"
C(){k=3;
A*pa=NULL;
Bb,*pb;
C*pc;
b;
pb=dynamic_cast<
if(pb){
pb->
show();
pb->
j<
else
Convertionfailed"
pc=dynamic_cast<
C*>
if(pc){
pc-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC 数据类型 转换