Если у меня есть следующее объявление:
#include <iostream>
#include <string>
class DEMData
{
private:
int bitFldPos;
int bytFldPos;
std::string byteOrder;
std::string desS;
std::string engUnit;
std::string oTag;
std::string valType;
int idx;
public:
DEMData();
DEMData(const DEMData &d);
void SetIndex(int idx);
int GetIndex() const;
void SetValType(const char* valType);
const char* GetValType() const;
void SetOTag(const char* oTag);
const char* GetOTag() const;
void SetEngUnit(const char* engUnit);
const char* GetEngUnit() const;
void SetDesS(const char* desS);
const char* GetDesS() const;
void SetByteOrder(const char* byteOrder);
const char* GetByteOrder() const;
void SetBytFldPos(int bytFldPos);
int GetBytFldPos() const;
void SetBitFldPos(int bitFldPos);
int GetBitFldPos() const;
friend std::ostream &operator<<(std::ostream &stream, DEMData d);
bool operator==(const DEMData &d) const;
~DEMData();
};
чем код должен быть в деструкторе? Если я "удаляю" std::string
поля?
Ваш деструктор должен уничтожить только те члены, для которых вы выделяете ресурсы. так что нет, вы не "удаляете" строки.
Вы удаляете указатели, которые вы выделяете с помощью new
Ваш деструктор не должен быть больше, чем
~DEMData()
{
}
Нет, члены std::string автоматически выделяются на стеке или куче для вас и автоматически очищаются. Вам не нужно делать ничего специального в вашем деструкторе для обработки строк.
Нет, вам не следует удалять объекты std :: string
. они будут автоматически освобождены при вызове их деструктора.
Вам не нужен деструктор (ни конструктор копирования, ни перегруженный оператор присваивания). В этом весь смысл использования класса, такого как строка, который делает что-то за вас, вместо того, чтобы использовать строки в стиле C и ручное управление памятью.
Компилятор производит все вышеупомянутое за вас, и по умолчанию деструктор просто вызывает деструкторы всех членов (это происходит неявно даже после завершения определенного пользователем деструктора). Деструктор String берет на себя ответственность оттуда.