2010/11/5
关键字:delete、类型转换
delete
1. 必须确保delete的指针是用new分配的地址指针.
2. 0指针可以delete,但是没有任何意义.
3. 多次重复delete同一块内存会破坏自由存储区.
4. const动态对象也需要用delete释放掉.
const char*p = new char;
delete p;
5. delete后应该紧接着将指针置为0,以避免悬垂指针.
类型转换
隐式类型转换-例如double和int类型相加时,编译器会将操作数自动转换成同样的类型后再相加,无需程序员介入,成为隐式类型转换(implicit type conversion).
下面几种情况会发生隐式类型转换:
1. 混合类型表达式中,操作数会被转换成同样的类型
int ival = 0;
double dval = 1.2;
ival = ival + dval;
实际上分3个步骤:
a. 将ival转换成double类型
b. 将ival和dval相加
c. 将结果转换成int型赋值给ival
2. 用作条件的表达式被转换成bool类型
int ival = 0;
if (ival)
//...
while(ival)
//...
3. 用表达式初始化或给某个变量赋值时
int ival = 3.14; //常量表达式.14转换成int型
char *p = 0; //0转换成char*类型指针
4. 某些函数调用中,后续讨论.
枚举类型转换
将enum对象转换为什么类型取决于机器定义和枚举成员的最大值.至少会提升到int类型,如果还不足以保存最大的成员,则提升到能表示所有枚举类型比int大的最小类型如unsined int、long、unsigned long.
显式转换
也称为强制类型转换,C++包含下面4种操作符:
1. static_cast
可以表示编译器隐式执行的任何类型的转换.
2. dynamic_cast
支持运行时识别指针或引用所指向的对象.后期讨论.
3. const_cast
用于转换掉const属性,一般使用该转换可以认为有设计缺陷
4. reinterpret_cast
为操作数的位模式提供较低层次的重新解释.例如
int *p1 = 0;
char *p2 = reinterpret_cast<char*>(p1);
string str(p2); //运行时错误
我们必须记得p2实际是int型对象的指针,而非字符数组.任何假设pc是普通字符指针的应用,都有可能带来有趣的运行时错误.
reinterpret_cast本质上依赖于机器,为了安全使用,要求程序员完全理解所涉及的数据类型,以及编译器实现强制类型转换的细节.
C中只有一种强制类型转换例如:
int *p1 = 0;
char *p2 = (char*)p1;
效果与使用reinterpret_cast相同,但这种转换可视性差,难以跟踪错误的转换.
旧式转换实际和const_cast、static_cast、reinterpret_cast相同,dynamic_cast是C++中新加入的.