第七节 模板(Templates)(7)
----------------------------------
下面的例子中,一个类型为 bad_typeid 的例外(exception的引申类),在要求类型信息的对象为一个空指针的时候被捕获:
// standard exceptions
#include <iostream.h>
#include <exception>
#include <typeinfo>
class A {virtual void f() {}; };
int main () {
try {
A * a = NULL;
typeid (*a);
} catch (std::exception& e) {
cout << "Exception: " << e.what();
}
return 0;
} |
Exception: Attempted typeid of NULL pointer |
你可以用这个标准的例外层次结构来定义的你的例外或从它们引申出新的例外类型。
类型转换高级 (Advacned Class Type-casting)
目前为止,我们一直使用传统的类型转换符来进行简单对象的类型转换。例如,要把一个double类型的浮点型数字转换为int 的整型数字,我们是这样做的:
int i;
double d;
i = (int) d;
或者
i = int (d);
这样做对基本数据类型时没问题的,因为基本数据类型的转换已经有标准的定义。同样的操作也可以被在类或类的指针上,因此以下例子中的写法也是没有问题的:
// class type-casting
#include <iostream.h>
class CDummy {
int i;
};
class CAddition {
int x,y;
public:
CAddition (int a, int b) { x=a; y=b; }
int result() { return x+y;}
};
int main () {
CDummy d;
CAddition * padd;
padd = (CAddition*) &d;
cout << padd->result();
return 0;
}
|
|
虽然以上程序在C++中是没有语法错误的(多数编译器甚至不会产生警告信息),但这段程序没有什么实际的逻辑意义。我们使用了CAddition 的成员函数result 而没有定义一个相应的该类的对象:padd 并不是一个对象,它只是一个指针,被我们赋值指向一个毫无关系的对象的地址。当在程序运行到访问它的result 成员函数时,将会有一个运行错误(run-time error)产生,或生成一个意外的结果。
为了控制这种类之间的转换,ANSI-C++ 标准定义了4种新的类型转换操作符: reinterpret_cast, static_cast, dynamic_cast 和 const_cast。所有这些操作符都是同样的使用格式:
reinterpret_cast <new_type> (expression)
dynamic_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)
这里new_type 是要转换成的目标类型,expression 是要被转换的内容。为了便于理解,模仿传统转换操作符,它们的含义是这样的:
(new_type) expression
new_type (expression)
reinterpret_cast
reinterpret_cast 可以将一个指针转换为任意其它类型的指针。它也可以用来将一个指针转换为一个整型,或反之亦然。
这个操作符可以在互不相关的类之间进行指针转换,操作的结果是简单的将一个指针的二进制数据(binary copy)复制到另一个指针。对指针指向的内容不做任何检查或转换。
|
----------------------------------