>> Таким образом, происходит двойное присвоение, сначала str = new, затем memcpy(str,...).
никакого двойного присваивания не происходит
str = new unsigned char[size];
только выделяет память и запоминает, где эта память выделена, сама память не инициализируется.
копирование данных происходит внутри memcpy.
справедливости ради, если у вас typeof( str ) == typeof( usigned const char * ), то вы не сможете вызвать memcpy без приведения типа, т.к. у вас указатель на неизменяемые данные.
вам надо:
class A
{
private:
unsigned const char *str;
A(): str( nullptr ) // можно и не инициализировать в принципе, если уверены,
// что не будете читать его до инициализации
{
}
init(… )
{
unsigned char *ptr = new unsigned char[size];
memcpy( ptr,… );
str = ptr; // сами данные вы тут не меняете, только указатель на данные
}
usigned const char *get() const{ return str; }
};