Вопрос
Это довольно просто, но я не могу ухватиться за это. Справка здесь
Находятся void *p
и const void *p
достаточно отличается? Зачем использовать функцию const void *
вместо void *
?
Решение
Причина использовать void*
вообще (будь то const
или нет) - это вид дженетности, который он обеспечивает. Это как базовый класс: все указатели находятся void*
и может неявно бросить в это, но отбрасывает из void*
Чтобы напечатать указатели должны быть сделаны явно и вручную.
Обычно у C ++ есть лучшие способы предложить это (а именно OO и шаблоны), поэтому не имеет большого смысла использовать void*
вообще, за исключением случаев, когда вы взаимодействуете C. Однако, если вы его используете, то const
предлагает именно то, что он предлагает в другом месте: вам нужен (дополнительно) const_cast
Чтобы иметь возможность изменить упомянутый объект, чтобы вы с меньшей вероятностью изменили его случайно.
Конечно, это полагается на то, что вы не используете C-стиль, а явные кастины C ++. Актерский состав от void*
любому T*
Требуется а static_cast
, и это не позволяет удалить const
. Анкет Так что вы можете разыграть const void*
к const char*
с использованием static_cast
, но не char*
. Анкет Это понадобится дополнительная const_cast
.
Другие советы
В C ++ a 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
Есть простое различие. Как указывалось, мало необходимо использовать void*
В C ++ из -за его системы лучшего типа, шаблонов и т. Д. Однако при взаимодействии с C или к системным вызовам вам иногда нужен способ указать значение без известного типа.
Как вы спрашиваете, разница между void*
и const void*
является подсказкой, чтобы показать вам, будет ли содержимое заостренной памяти изменено в функции, которую вы вызываете, const
Это означает, что он будет иметь доступ только для чтения.