Явные конструкторы копирования объявляются лишь в тех случаях, когда функционала неявного недостаточно, то-есть, например, Queue динамически выделяет память:
class Queue{
public:
char * name;
Queue(const * char ch){
name = new char[strlen(ch)+1];
memcpy(name, ch, strlen(ch)+1);
};
~Queue(){
delete [] name;
};
}
В таком случае нам понадобится определять явный конструктор копирования и перегружать оператор =.
Конструктор копирования по умолчанию, как и неявный оператор присваивания выполняет почленное копирование, а значит если мы все не сделаем как надо - будут повреждения и утечки памяти:
Queue * q1 = new Queue("test");
Queue q2(*q1);
delete q1;
std::cout<<q2.name; //Утечка памяти
Давайте же сделаем правильно:
Queue::Queue(const Queue & rq){
delete [] name;
name = new char[strlen(rq)+1];
memcpy(name,rq,strlen(rq)+1);
}
Queue & Queue::operator=(const Queue & rq){
if(this==&rq)return *this;
delete [] name;
name = new char[strlen(rq)+1];
memcpy(name,rq,strlen(rq)+1);
return *this;
}
Теперь получаем:
Queue * q1 = new Queue("test");
Queue q2(*q1);
delete q1;
std::cout<<q2.name; //test