如何在参数non-const中传递const指针

时间:2012-05-10 23:45:45

标签: c++ pointers const param

我有两个指针(const Vec * a和const Vec b) 在给定的代码片段中,我需要传递这两个值,这些值在代码期间被实例化,用于没有参数(const Vec *)但只有(Vec *)的函数。 如果不移动函数定义,我怎么能这样做,但如果有必要,我应该采取什么程序?

//const Vec* from;
//const Vec* at;
Vec* viewVec; 
viewVec = Vec::sub( view->at, view->from);


//static Vec* sub(Vec*, Vec*);
Vec* Vec::sub(Vec* a, Vec* b) {
    return new Vec(a->x - b->x, a->y - b->y, a->z - b->z);
}

4 个答案:

答案 0 :(得分:2)

最简单的答案可能是:“不要”。如果您需要使用Vec *而不是Vec const *,请以此方式声明。

如果这是某些承诺不修改它的第三方功能但由于某种原因而厌恶const,那么其他人列出的const_cast解决方案是您唯一的选择(除了使用更好的第三方库。)

如果您指向的指针std::vector实际上不是const(在声明点),而您恰好有std::vector const *引用它,那么在它上面使用const_cast是“安全的”(但通常仍然是不明智的)。但是,如果您修改最初声明为const的任何变量,那么它是未定义的行为。例如,编译器可能会看到您在std::vector const多次执行一些昂贵的操作,并且可以自由地缓存结果的某些部分,因为它可以假设它总是处理相同的事情,所以如果你改变它,你可能得到不正确(甚至不一致)的结果。

答案 1 :(得分:1)

您可以使用const_cast,例如

viewVec = Vec::sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));

你是否应该是另一回事。如果你真的无法改变函数的签名(这可能是最简单的修复),你总是可以编写一个包含狡猾的转换的包装器 - 这样,至少调用者不需要自己进行任何转换:

Vec *Vec::sub(const Vec *a, const Vec *b) {
    return sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from));
}

答案 2 :(得分:0)

const_cast<type>(value)你去;)

答案 3 :(得分:0)

正如人们提到的,你可以使用const_cast。您必须小心这样做的原因是您最终可能会修改不应修改的内容。例如,如果某个对象将指针声明为const,那是因为它希望确保此指针不能更改。如果你然后const_cast指针并将其传递给另一个函数,那么另一个函数可以使它指向一个新的东西,因此拧紧试图保护它的原始对象。

特别是,如果对象A分配了const指针指向的某段内存,该怎么办?如果你然后通过const_cast将指针传递给一个函数并且这个函数delete是内存,或者重新alloc它,那么原始的内存将会被取消删除。

希望这有帮助。