如果您的班級中有指針,則可能是做錯了事。
這將是更好地將其重新寫爲:
class GPSPoint
{
private:
double lat;
double lon;
double h;
std::string label;
public:
GPSPoint (GPSPoint const& copy)
: lat(copy.lat)
, lon(copy.lon)
, h(copy.h)
, label(copy.label)
{}
// You should also have an assignment operator
GPSPoint& operator=(GPSPoint copy) // Use Copy/Swap idum.
{ // Pass by value to get implicit copy
this->swap(copy); // Now swap
return *this;
}
void swap(GPSPoint& copy) throw()
{
std::swap(lat, copy.lat);
std::swap(lon, copy.lon);
std::swap(h, copy.h);
std::swap(label,copy.label);
}
};
現在看起來很簡單。
但是,嘿,我們忘了有編譯器生成的拷貝構造函數:
所以現在簡化過:
class GPSPoint
{
private:
double lat;
double lon;
double h;
std::string label;
};
完成。越簡單越好。如果你必須絕對保持指針(因爲你認爲它是一種優化(它不是),或者你需要學習指針(你這樣做,但你需要學習何時不使用它們))。
class GPSPoint
{
private:
double lat;
double lon;
double h;
char* label;
public:
// Don't forget the constructor and destructor should initialize label
// Note the below code assumes that label is never NULL and always is a
// C-string that is NULL terminated (but that each copy creates
// and maintains its own version)
GPSPoint (GPSPoint const& copy)
: lat(copy.lat)
, lon(copy.lon)
, h(copy.h)
, label(new char[strlen(copy.label)+1])
{
std::copy(copy.label, copy.label + strlen(label) + 1, label);
}
// You should also have an assignment operator
GPSPoint& operator=(GPSPoint copy) // Use Copy/Swap idum.
{ // Pass by value to get implicit copy
this->swap(copy); // Now swap
return *this;
}
void swap(GPSPoint& copy) throw()
{
std::swap(lat, copy.lat);
std::swap(lon, copy.lon);
std::swap(h, copy.h);
std::swap(label,copy.label);
}
};
它看起來像'運營商=',而不是拷貝構造函數 – a1ex07
使用'的std :: string'爲'label',或者如果你正在從禁止對一些愚蠢的原因,寫自己的字符串類和使用它;沒有理由。 – GManNickG