转换为void指针时是否丢弃该值?

时间:2017-06-09 22:18:32

标签: c++

代码:

class CFoo
{
   int a;
public:
   CFoo():a(1){}
   ~CFoo(){}
   getNum(){return a;}
};

void tfunc(void* data)
{
    CFoo* foo = static_cast<CFoo*>(data);
    std::cout << "Number: " << foo->getNum();
    delete foo;
}

int main()
{
   CFoo* foo = new CFoo;
   void* dt = static_cast<void*>(foo);
   tfunc(dt); // or tfunc(static_cast<void*>(food));

   return 0;
}

转换为void指针时,不会丢弃该值,如果是,foo->getNum()如何有效?

1 个答案:

答案 0 :(得分:0)

  

转换为void指针时,不会丢弃该值。

语句转换的值是指针,而不是指针指向的对象。

void* dt = static_cast<void*>(foo);

变量foo的值是某个CFoo对象的地址。该语句定义了一个具有相同值的新变量dt(即,foodt都指向同一个地址),但编译器不允许您取消引用{{ 1}} ---它不允许你从该地址获取*dt对象---因为void类型没有值。

当你的程序调用{​​{1}}时,正式参数void也会获得相同值的副本(即,它指向相同的地址),最后是局部变量{{1在tfunc内。

data内的本地foo的声明类型是tfunc的指针,因此编译器将允许您取消引用;而且,这是有道理的,因为您知道foo确实指向合法的tfunc对象。