Primero, el puntero de su clase es estático (es decir, el compilador sabe que hay un puntero en esta clase y qué tamaño tiene, por lo que no se necesita asignación de memoria dinámica cuando se crea una instancia de la clase).
Si copia la clase (y no tiene un constructor de copia especial definido), el puntero en la nueva clase apuntará al mismo lugar en la memoria que el puntero en la clase anterior. Para aclarar:
#include <iostream>
class A {
public:
int *p;
};
int main() {
A a,b;
a.p = new int(10);
b = a;
std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
std::cout << "*(b.p) = " << *(b.p) << std::endl; // 10
*(b.p) = 3;
std::cout << "*(a.p) = " << *(a.p) << std::endl; // 3
std::cout << "*(b.p) = " << *(b.p) << std::endl; // 3
return 0;
}
Ahora bien, si desea asignar la nueva memoria al copiar, tiene que escribir un constructor de copia y un constructor de asignación de copia:
#include <iostream>
class A {
public:
int *p;
A() : p(0) {}
A(const A& other) { // copy constructor
p = new int(*other.p);
}
A& operator=(const A& other) { // copy assignment constructor
// protect against self assignment
if (this != &other) {
if (p != 0) {
*p = *other.p;
} else { // p is null - no memory allocated yet
p = new int(*other.p);
}
}
return *this;
}
~A() { // destructor
delete p;
}
};
int main() {
A a,b;
a.p = new int(10);
b = a;
std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
std::cout << "*(b.p) = " << *(b.p) << std::endl; // 10
*(b.p) = 3;
std::cout << "*(a.p) = " << *(a.p) << std::endl; // 10
std::cout << "*(b.p) = " << *(b.p) << std::endl; // 3
return 0;
}
Al hacer esto también se debe escribir una destructor (consulte Rule of three), porque la memoria asignada en los constructores de asignación de copia/copia debe ser desasignada si la clase se destruye:
Los punteros y los datos que señalan están separados. La respuesta de Martin a continuación debería aclarar si no revisa esto para obtener información básica: http://www.cplusplus.com/doc/tutorial/pointers/ – AJG85