Если вы действительно хотите использовать * int, я бы использовал умные указатели, чтобы упростить владение ресурсом:
class Test
{
public:
Test(){p=std::shared_ptr<int>(new int(0));}
Test(const Test &src){p=std::shared_ptr<int>(new int(*(src.p.get())));}
~Test()=default;
Test& operator= (const Test& src) {p = std::make_shared<int>(*(src.p.get())); return *this;}
void show(){cout<<*(p.get())<<endl;}
void setx(int a) {*(p.get())=a;}
private:
std::shared_ptr<int> p;
};
однако, не слишком много смысла использовать указатель или умный указатели (обфусцированный код), учитывая, что продолжительность жизни int совпадает с самим объектом (поэтому вам не нужно динамически выделять его):
class Test
{
public:
Test():p(0){}
Test(const Test &src):p(src.p){}
~Test()=default;
Test& operator= (const Test& src) {p = src.p; return *this;}
void show(){cout<<p<<endl;}
void setx(int a) {p=a;}
private:
int p;
};