std :: string in struct - Проблемы с копированием / присваиванием? - PullRequest
5 голосов
/ 06 января 2010

Предположим, у меня есть структура, содержащая std :: string, например:

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];
}

Когда я вставляю структуры пользовательских данных в std :: map, создается копия структуры, верно? Создается ли новая std :: string, используя значение поля username, или происходит какое-то побитовое копирование (это было бы плохо)? Точно так же, когда я возвращаю структуру userdata из метода GetUserData, имеет ли она независимую строку, содержащую имя пользователя, или мне нужно определить ctor копии и явно создать новую строку?

Ответы [ 4 ]

10 голосов
/ 06 января 2010

Вам не нужно делать ничего особенного. C ++ (и реализация STL) определяют, что это просто работает.

3 голосов
/ 06 января 2010

std :: strings могут быть скопированы без проблем.

Когда вы определяете класс (или структуру), C ++ по умолчанию сгенерирует для вас ряд методов, включая конструктор копирования и оператор присваивания. Я считаю, что сгенерированный конструктор копирования будет вызывать конструктор копирования для каждого из полей, а сгенерированный оператор присваивания будет вызывать оператор присваивания для каждого из полей. Поскольку ваша структура пользовательских данных копируется, для поля имени пользователя будет вызван конструктор копирования std :: string.

Контейнеры и алгоритмы STL должны использовать некоторую комбинацию конструктора копирования и оператора присваивания, поэтому все должно быть в порядке.

2 голосов
/ 06 января 2010

Пока у вас нет указателей в качестве ваших камер данных, с вами все будет в порядке.

0 голосов
/ 06 января 2010

std :: string подсчитывается по ссылке, и имеет место его конструктор копирования . Так что не о чем беспокоиться. Все обрабатывается правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...