现在的位置: 首页 > 综合 > 正文

C++中的类型转换

2013年08月08日 ⁄ 综合 ⁄ 共 1080字 ⁄ 字号 评论关闭
在课上有这样一个问题:一个class A里面有一个函数,它由cosnt和非const两个版本构成重载。现有这个class的一个非const对象a,如果直接用a去调用这个函数,那么肯定 会是非const的版本将被调用。那么,怎样用a来调用那个const版本的函数呢?这个问题其实不难:既然a是非const的,那么我们把它转换成 const A不就可以用来调用const版本的函数了吗?

其 实,这个回答说对也对,说不对也不对,关键在于怎么去实施这个“转换”。有三种方法:直接转换对象,转换对象指针,转换对象引用。而正确的做法只有后面两 种。为什么呢?因为在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;是非法的。 

抱歉!评论已关闭.