Предположим, что у меня есть структура, содержащая станд.:: строка, как это:
struct userdata{
int uid;
std::string username;
}
Я должен создать копию ctor или что-нибудь, чтобы возвратить его из функции или использовать его в контейнере STL? Рассмотрите эту функцию:
userdata SomeClass::GetUserData(unsigned int uid)
{
//do error checking and other stuff...
//m_usermap is std::map<unsigned int, userdata>
return m_usermap[uid];
}
Когда я вставляю userdata структуры в станд.:: карта, копия структуры создается, правильно? Делает новый станд.:: строка получает созданное использование значения поля имени пользователя, или своего рода поразрядная копия происходит (это было бы плохо)? Точно так же, когда я возвращаю userdata структуру из метода GetUserData, это имеет независимую строку, содержащую имя пользователя, или я должен определить копию ctor и явно создать новую строку?
]std::string [] имеет ссылку, а его [] конструктор копирования. Так что беспокоиться не о чем. Все обрабатывается корректно. [
Ты не должен делать ничего особенного. С++ (и реализация STL) определяют это, чтобы просто работать.
.До тех пор, пока у вас нет указателей, как у членов вашей базы данных, вы будете в порядке.
std::строки сами по себе могут быть скопированы без проблем.
Когда вы определяете класс (или структуру), C++ по умолчанию сгенерирует для вас ряд методов, включая конструктор копирования и оператор присваивания. Я считаю, что сгенерированный конструктор копирования будет вызывать конструктор копирования по каждому из полей, а сгенерированный оператор присваивания будет вызывать оператор присваивания по каждому из полей. По мере копирования Вашей структуры userdata, конструктор копирования std::string будет вызываться для поля имени пользователя.
Контейнеры и алгоритмы STL должны использовать некоторую комбинацию конструктора копирования и оператора присваивания, поэтому все должно быть в порядке.