2010-09-14 3 views
1

Это своего рода базовый, но я не могу поверить в это. Артикул hereуказатель на void

Есть void *p и const void *p достаточно разные? Зачем использовать функцию const void * вместо void *?

+1

существенно отличается для чего? –

+0

Я имею в виду, что имеет смысл иметь что-то как «const void»? – Chubsdad

+2

Да, это указатель на неизменный объект неизвестного типа. –

ответ

6

Причина использования void* вообще (независимо от того, является ли она const или нет). Это как базовый класс: все указатели - этоvoid* и могут неявно вставлять в него, но отличные от void* набранные указатели должны выполняться явно и вручную.

Как правило, у C++ есть лучшие способы сделать это (а именно OO и шаблоны), поэтому не имеет смысла использовать void* вообще, за исключением случаев, когда вы взаимодействуете с C. Однако, если вы используете его , то const предлагает только то, что он предлагает в другом месте: вам нужно (дополнительно) const_cast, чтобы иметь возможность изменить объект, на который ссылается, поэтому вы вряд ли сможете его случайно изменить.

Конечно, это зависит от того, что вы не используете C-style casts, но явные C++-ролики. Литой от void* к любому T* требуется static_cast, и это не позволяет удалить const. Таким образом, вы можете отливать const void* до const char*, используя static_cast, но не до char*. Это потребует дополнительного const_cast.

+0

Хороший ответ, но я думаю, что это не то, о чем просили. Это разница между версией const и non const. –

+2

Я считаю, что от 'void *' до 'T *' требуется 'static_cast'. 'reinterpret_cast' всегда реализуется, и его следует избегать. –

+0

Я думаю, что ОП знает значение 'const', он просто говорит, что он не понимает, что именно сделать из' const void'. Поэтому я думаю, что это хороший ответ. И хорошее использование 'reinterpret_cast', между прочим. – Gorpik

1

Простая разница. Как было указано, нет необходимости использовать void* в C++ из-за его лучшей системы типов, шаблонов и т. Д. Однако при взаимодействии с C или системными вызовами вам иногда нужен способ указать значение без известного типа.

Как вы спрашиваете, разница между void* и const void* намеком, чтобы показать вам, если содержимое заостренной памяти будет изменено в функции вы звоните, то const означает, что он будет иметь доступ только для чтения.

2

В C++ константа перед указателем говорит, что данные по адресу указателя не должны быть изменены. то есть он останавливает кто-то это делает:

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 
Смежные вопросы