1

这是一种基本的,但我似乎无法掌握这个。参考这里

void *pconst void *p足够不同?为什么要使用函数const void *而不是void *

4

3 回答 3

6

完全使用的原因void*(无论是否const)是它提供的那种通用性。它就像一个基类:所有指针 void*可以并且可以隐式转换到其中,但是从void*类型化指针转换必须显式地手动完成。

通常,C++ 提供了更好的方法来做到这一点(即 OO 和模板),所以使用它根本没有多大意义void*,除非你在与 C 接口时。但是,如果你使用它,那么它const提供了什么它在其他地方提供:您需要一个(附加的)const_cast才能更改所引用的对象,因此您不太可能意外更改它。

当然,这取决于您不使用 C 风格的强制转换,而是使用显式的 C++ 强制转换。转换fromvoid*到 anyT*需要 a static_cast,这不允许删除const. 因此,您可以const void*转换为const char*using static_cast,但不能转换为char*。这将需要一个额外的const_cast.

于 2010-09-14T10:11:43.880 回答
2

在 c++ 中,指针前面的 const 表示不应更改指针地址处的数据。即它阻止某人这样做:

int v1 = 3;
int v2 = 4;
const int *pv = &v1;
pv = &v2 // ok;
*pv = 5; // error

您还可以将指针值本身设为 const:

int v1 = 3;
int v2 = 4;
int * const pv = &v1;
*pv = 5; // ok
pv = &v2; // error

您也可以将两者结合起来:

int v1 = 3;
int v2 = 4;
const int * const pv = &v1;
*pv = 5; // error
pv = &v2; // error
于 2010-09-14T10:26:55.823 回答
1

有一个简单的区别。如前所述,void*由于其更好的类型系统、模板等,几乎不需要在 C++ 中使用。但是,当与 C 或系统调用接口时,有时需要一种方法来指定没有已知类型的值。

void*如您所问,和之间的区别const void*是向您显示指向内存的内容是否将在您调用的函数中被修改的提示,这const意味着它将具有只读访问权限。

于 2010-09-14T10:20:16.267 回答