其 实,这个回答说对也对,说不对也不对,关键在于怎么去实施这个“转换”。有三种方法:直接转换对象,转换对象指针,转换对象引用。而正确的做法只有后面两 种。为什么呢?因为在C++里面,一个对象一旦存在,它是什么类型就是什么类型,它的类型是不会改变的,包括对象、指针、引用。我们说的转换,只是用这些 对象本身去创建了一个我们期望的那个类型的一个临时变量。因此,对于这个问题中的函数调用而言,我们可以用一个临时指针、一个临时引用去调用函数——指 针、引用是临时的,但它们还是指向了原来那个对象,但却不可以用一个临时对象去调用函数——函数调用者就完全是不同于原来那个对象的另外一个对象了。举例 说明吧:
#include <iostream>
using namespace std;
class A
{
int val;
public:
A(int v) : val(v) {}
void inc();
void disp() const;
};
void A::inc()
{
++val;
}
void A::disp() const
{
cout << "value is " << val << endl;
}
int main(int argc, char *argv[])
{
const A a(10);
((A)a).inc();
a.disp();
(const_cast<A *>(&a))->inc();
a.disp();
return 0;
}
运 行这段代码,第一次调用a.disp()时,打印的结果仍然是10,因为这并不是a在调用inc()函数,而是一个临时对象在调用;而第二次调用 a.disp()时,打印的结果却是11了,因为虽然转换的那个指针是临时的,但它还是指到了a对象上面,所以的确是a在调用inc()函数。
其实,在C++中的类型转换都是这个样子的——产生一个目的类型的临时变量。所以在以后的使用中,一定要灵活去运用指针和引用来做事情,以免以假乱真。
PS:对于有些编译器来讲,为了保证常对象正确初始化,会要求这个类A显示提供一个构造函数。如果这个A没有显示提供任何构造函数,那么const A a;是非法的。