代码:
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()
如何有效?
答案 0 :(得分:0)
转换为void指针时,不会丢弃该值。
语句转换的值是指针,而不是指针指向的对象。
void* dt = static_cast<void*>(foo);
变量foo
的值是某个CFoo
对象的地址。该语句定义了一个具有相同值的新变量dt
(即,foo
和dt
都指向同一个地址),但编译器不允许您取消引用{{ 1}} ---它不允许你从该地址获取*dt
对象---因为void
类型没有值。
当你的程序调用{{1}}时,正式参数void
也会获得相同值的副本(即,它指向相同的地址),最后是局部变量{{1在tfunc
内。
data
内的本地foo
的声明类型是tfunc
的指针,因此编译器将允许您取消引用;而且,这是有道理的,因为您知道foo
确实指向合法的tfunc
对象。