Кстати, это тоже хороший пример того, как делать не надо. Этот код не прошёл бы у меня ревью и был бы завёрнут на доработку. Копи-паст - это зло. Как только внутренняя структура класса меняется, то нужно будет не забыть поменять два места. В подобных случаях обычно вводится утилитарный метод, позволяющий избавиться от дубликации кода. После добавления проверки на копирование в самого себя, код будет выглядеть следующим образом:Сионист писал(а):Код: Выделить всё
class A { int *Data; public: A () { Data=new int [1000000]; }; ~A () { delete [] Data; } A (const A &a) { int *p1; int *p2; Data=new int [1000000]; for (p2=Data+999999, p1=a.Data+999999; p2>=Data; --p1, --p2) { *p2=*p1; } } A operator = (const A &a); { int *p1; int *p2; for (p2=Data+999999, p1=a.Data+999999; p2>=Data; --p1, --p2) { *p2=*p1; } return *this; } ... }; ... A a; a=a;
Код: Выделить всё
class A
{
int *Data;
public:
A ()
{
Data=new int [1000000];
};
~A ()
{
delete [] Data;
}
A (const A &a)
{
Data=new int [1000000];
CopyFrom(a);
}
A operator = (const A &a);
{
if (&a != this)
{
CopyFrom(a);
}
return *this;
}
...
private:
void CopyFrom(const A& a)
{
int *p1;
int *p2;
for (p2=Data+999999, p1=a.Data+999999; p2>=Data; --p1, --p2)
{
*p2=*p1;
}
}
};
...
A a;
a=a;
И, пожалуй, последнее замечание. Возвращение this по значению из оператора присваивания при том, что каждый объект этого класса весит минимум 4 мегабайта - это просто убийство. Конечно же не хватает амперсанда. Ребята, не делайте так никогда! Подобный код (взависимости от того, насколько он часто вызывается), может замедлить вашу программу в тысячи раз.