假设我有一个包含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时,会创建一个struct的副本,对吧?是否使用username字段的值创建了新的std :: string,或者是否发生某种按位复制(这会很糟糕)?类似地,当我从GetUserData方法返回userdata结构时,它是否有一个包含用户名的独立字符串,或者我是否需要定义一个副本ctor并显式创建一个新字符串?
答案 0 :(得分:9)
你不需要做任何特别的事情。 C ++(以及STL的实现)将其定义为正常工作。
答案 1 :(得分:3)
std :: strings本身可以没有任何问题地复制。
当您定义类(或结构)时,C ++默认会为您生成许多方法,包括复制构造函数和赋值运算符。我相信生成的复制构造函数将在每个字段上调用复制构造函数,生成的赋值运算符将在每个字段上调用赋值运算符。在复制userdata结构时,将为用户名字段调用std :: string的复制构造函数。
STL容器和算法应该使用复制构造函数和赋值运算符的某种组合,所以这一切都应该没问题。
答案 2 :(得分:2)
只要你没有指针作为你的datamembers,你应该没事。
答案 3 :(得分:0)
std :: string 是引用计数的,它的复制构造函数发生了。所以没什么值得担心的。一切都得到了正确处理。