分类: C/C++
2012-08-31 10:45:49
C++里,对象类型转化问题是需要严加注意的一个问题,包括隐式转换,强制转化,旧式转化等种类,需要加以总结。本篇文章概括总结类型转化问题,并侧重于类型的隐式转换问题。关于强制转换的详细的内容放在下篇文章中总结。
一、类型相关:如果两个类型可以相互转换,则称这两个类型相关。只用相关类型之间才可能发生隐式类型或显示类型转换。
1.算术类型之间的转换:算术类型指不包括void的内置类型,算术类型之间可以相互转换。
转换规则根据不同的转换条件而不同
2.算术类型和bool类型之间的转换:可将算术对象转换为bool类型,bool对象也可以转换为int型
3.整型和枚举类型:自动将枚举类型的对象或者成员转换为整型
4.指针转换:(
(1)大部分情况下数组名会自动转换为指向第一个元素的指针(但不完全是这样)
(2)指向任意数据类型的指针都可以转为void*类型(指向const任意类型对象的指针只能都可以转为const void * 而不能转为void *)
(3)整数0可以转换为任意类型指针
(4)指针可以转化为bool类型
5.转为const对象:可以用非const对象或其引用初始化化或赋值给const对象;
可以用非const对象或其引用初始化化const的引用;
可以用非const对象的地址或其非const指针初始化或赋值给指向const对象的指针;
可以用const对象或其引用初始化或赋值给非const对象;(如:const指针和非const指针可以相互赋给或初始化)
不可以用const对象或其引用初始化非const引用;
不可以用const对象的地址或指向其指针初始化或赋值给非指向const对象的指针;
6.由标准库类型定义的转换:如可将iosteam对象转为bool型
7.到类类型的转换:如果在存在一个非explicit的且只有一个其他类型的参数或其引用的构造函数,则存在从该参数类型到该类类型的转换
8.从类类型的转换:必须定义一个特殊的成员函数:转换操作符
通用形式是:operator type (){}
9.从派生类到基类的转换:(1)非对象转换:可以用派生类对象或其引用初始化基类类型的引用
也可以用派生类对象的地址对基类类型指针进行赋值或初始化
这两种情况下基类类型的指针或引用只能访问派生类对象的基类部分和虚函数(见C++ Primer p498)
(2)对象转换:用派生类对象对基类对象进行初始化或赋值
这种情况下基类对象只拥有派生类对象的基类部分
10.从基类到派生类的转换:一般是不行的
二、隐式类型转换条件和规则:
1.初始化或赋值:规则是右操作数转换为左操作数类型
2.函数调用:实参类型转换为形参类型
3.混合类型的表达式:
(1)如果操作符是算术操作符且操作数都是算术类型(或从类类型转换到算术类型):这按算术转换规则进行,
即将每个操作数转为表达式中最宽的类型
(2)如果操作符是关系操作符且操作数都是算术类型(或从类类型转换到算术类型):这按算术转换规则进行,
即将每个操作数转为表达式中最宽的类型
(3)其他情况的规则:看情况而定
4.条件表达式:用作判断条件的表达式:出现在if,while,for语句中的条件表达式;条件操作符(?:)第一个操作数;
逻辑操作符的操作数等。
转换规则:将表达式结果转换为bool类
三、显式(或说强制)类型转换和规则:
1.转换条件:(1)覆盖或修改通常的隐式转换
(2)存在多种转换时,需要选择一种特定的类型转换
2.转换规则:
转换表达式为 cast-name
其中cast-name是static_cast,dynamic_cast,const_cast,reinterpret_cast中的一个
各个命令的转换规则可查书
四、旧式强制类型转换(略)
例子:int * ip;
char* cp=(char*) ip;