2010-09-14 62 views
1

这是一种基本的,但我似乎无法得到这一个。参考here指向void

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

+1

什么明显不同? – 2010-09-14 10:11:51

+0

我的意思是说'const void *'有意义吗? – Chubsdad 2010-09-14 10:13:42

+2

是的,它是一个指向未知类型的不可变对象的指针。 – 2010-09-14 10:24:17

回答

6

根本就使用void*的原因(无论const与否)都是它提供的通用性。它就像一个基类:所有指针都是void*并且可以隐式投射到它中,但是从void*转换为类型化指针必须明确和手动完成。

通常,C++有更好的方法来提供这样的操作(即OO和模板),所以除了当你连接C时,使用void*没什么意义。但是,如果你使用它,那么const就提供了它在其他地方提供的内容:您需要一个(附加的)const_cast才能够更改所引用的对象,因此您不太可能意外更改它。

当然,这依赖于你不使用C风格的转换,而是明确的C++转换。从void*到任何T*的剧组都需要static_cast,并且这不允许删除const。因此,您可以使用static_castconst void*投射到const char*,但不投射到char*。这将需要额外的const_cast

+0

很好的答案,但我认为这不是问题。这是const和非const版本之间的区别。 – 2010-09-14 10:18:09

+2

我相信从'void *'强制转换为'T *'需要'static_cast'。 'reinterpret_cast'总是实现定义的,应该避免。 – 2010-09-14 10:21:02

+0

我认为OP知道'const'的含义,他只是说他不明白'const void'的具体含义。所以我认为这是一个很好的答案。顺便说一下,'reinterpret_cast'的使用很好。 – Gorpik 2010-09-14 11:27:10

1

有一个简单的区别。正如其他人所说,由于C++有更好的类型系统,模板等,所以很少需要在C++中使用void*。但是,当连接到C或系统调用时,有时需要一种方法来指定没有已知类型的值。

至于你问,void*const void*之间的区别是向您展示,如果尖存储器的内容将你打电话时,const这意味着将有一个只读访问的函数中被修改的提示。

2

在C++中,指针前面的const表示指针地址处的数据不应该改变。即停止有人这样做:

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

您也可以使指针值本身就是一个常量:

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