конструктор копий и перегрузка оператора = ООП C++

программирование C++ ООП

подскажите. какой смысл создавать конструктор копий, если я перегружаю знак =, вот у меня без него все работает на ура, а если я к перегруженному = делаю еще конструктор копий то вылетаю с ошибкой сегментирования, список есть очередь, обычны двусвязный не циклический, перегружа. = так

queue &queue::operator =(const queue &obj)
{
ListEl *p=this->head;
ListEl *p1=obj.head;
for(int i=0;i<obj.n;i++)
{
if(i<this->n)
{
p->num=p1->num;

}
else
{
this->Add(p1->num);
}
p=p->next;
p1=p1->next;
}
return *this;
}
т.е. вот с этим все работает, а вот если добавить к нему конструктор копий , такой

queue::queue(const queue &obj)
{
ListEl *p=this->head;
ListEl *p1=obj.head;
if(p!=NULL)
{
for(int i=0;i<obj.n;i++)
{
if(i<this->n)
{
p->num=p1->num;
}
else
{
this->Add(p1->num);
}
p=p->next;
p1=p1->next;
}
}
else
{
for(int i=0;i<obj.n;i++)
{
this->Add(p->num);
p=p->next;
p1=p1->next;
}
}
}
то ничерта не работает, функция ADD добавляет элемент в список

Примечание:
в функции add она автоматом увеличивается

Примечание:
если его даже оставлять пустым, этот конструктор. то тоже вылетает ошибка сегментирования

Примечание:
уже нашел, но ошибку это не исправиль

Примечание:
там не будет мусора, ибо есть список. а если есть список то есть и колличество элементов

Примечание:
ttp://paste.org/pastebin/api/24995

Примечание:
это я все поправил, посмотри текущий код на пасте, там немного по другому, идет проверка есть ли список, если он есть то мы не инициализируем head а если его нет то мы туда загоняем нулл и начинаем добавлять элементы

Примечание:
this->head=NULL;
this->n=0;
this->tail=NULL;
this->ptrLast=NULL;
ListEl *p=this->head;
ListEl *p1=obj.head;
for(int i=0;i<obj.n;i++)
{
this->Add(p->num);
p=p->next;
p1=p1->next;
}
сделал так, по прежнему эррор

Примечание:
все, всем спасибо, понял, сделал
Ответы:
Ну вы как минимум не скопировали n
Вы делаете this->n, не проинициализировав n => в n лежит мусор.
>>там не будет мусора, ибо есть список. а если есть список то есть и колличество элементов
Во вновь созданном объекте будет мусор, до тех пор пока не проинициализируете все значения.
Проще будет, если вы весь код на pastebin.com закинете
Как вам уже сказали, перед выполнением любого конструктора объект находится в неопределённом состоянии. Для скорости C++ не инициализирует поля объекта в нулевые значения, как это делает, например C#. ListEl *p=this->head; — this->head содержит случайный адрес. Вы этот случайный адрес присвоили переменной p. Далее Вы с этой переменной p работаете, то есть пишите и/или читаете по случайному адресу. В результате чего и получаете совершенно закономерную ошибку сегментирования.
if(this->head!=NULL){...} — перевожу Ваш код на русский язык: если this->head не равно null, а содержит указатель на случайный участок памяти, то давайте что-нибудь прочитаем и/или запишим по этому адресу, и получим ошибку сегментации по этой причине. Чтобы ни содержал this->head это в любом случае мусор, а не указатель на список.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.