Короче говоря: нет.Это не ужасный оператор присваивания, но он не работает как конструктор копирования.
Во-первых, нет возможности для самопредставления, потому что вы ничего не присваиваете.this
указывает на неинициализированный блоб памяти в начале вашего конструктора, в то время как p
является полностью созданным объектом Point, который вы копируете.Два не могут совпадать.Таким образом, первоначальная проверка - пустая трата времени.
Далее, вы проверяете, чтобы убедиться, что label
не равно нулю.Как я уже сказал, this
указывает на неинициализированную память ... label
может быть любым значением в этой точке, нет никаких сведений о том, пройдет этот тест или нет.Если это не дает ноль, вы собираетесь delete[]
случайную часть памяти.Если вам повезет, это немедленно завершится неудачей, но это не обязательно.
С точки зрения стиля, предпочитайте списки инициализатора конструктора для инициализации членов.
GPSPoint (const GPSPoint& copy)
: lat(copy.lat)
, lon(copy.lon)
, h(copy.h)
, label(0)
{
if(copy.label) {
label = new char[ strlen( copy.label ) + 1 ];
strcpy ( label, copy.label );
}
}
С точки зрения корректности, избавьтесь от c-строки и используйте правильный класс строки.Тогда вам вообще не потребуется реализовывать конструктор копирования.
Независимо от того, что, если вы реализуете конструктор копирования, убедитесь, что вы реализуете оператор присваивания копии и деструктор;Я предполагаю, что они были оставлены для краткости, но если нет, то они очень важны.