gpt4 book ai didi

c++ - 为什么要转换为 void 指针?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:15 27 4
gpt4 key购买 nike

我在this question中看到了下面的代码:

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 的指针,而不是简单地将 void 指针分配给实际指针。就像打电话时一样 tfunc在上面的代码中,他可以这样调用它 tfunc(&foo)而不是像他使用静态转换那样将指针转换为 void 指针 static_cast<void*>(foo); ,对吧?

最佳答案

你的问题的措辞有点令人困惑,你实际上不是在问为什么要转换为 void*,你是在问为什么使用显式转换而不是依赖隐式转换,即

tfunc(static_cast<void*>(food)); // explicit casting

对比

tfunc(food); // implicit casting

这个问题比转换为 void* 更普遍。不幸的是,C++ 允许相当数量的隐式危险转换。例如。在 singedunsigned 之间,从更宽的整数或 float 到更窄的整数或 float ,转换为 bool 和转换为 void*。所有这些转换都有可能默默地在代码中引入错误。 c++11 在正确的方向上迈出了一小步,不允许缩小新的统一初始化语法 {},但由于向后兼容,所有以前的隐式转换仍然是允许。

这就是鼓励显式转换的原因。它有助于显示作者的意图。它表明转换是明确需要的,而不是悄无声息地发生,可能在作者不知情的情况下发生。同样非常重要的是,它有助于代码审查或阅读代码,因为它是一种标志,类似于“这里有强制转换。当你查看这段代码时要注意这一点”

关于c++ - 为什么要转换为 void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44466426/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com