这可能是一个明智的选择,但我有点难过。我的vectors not behaving nicely遇到了一些麻烦,现在看起来我找到了罪魁祸首。这是我的Player
课程的淡化版本。
class Player {
private:
std::string _firstName;
std::string _lastName;
public:
Player(std::string firstName, std::string lastName) {
_firstName = firstName;
_lastName = lastName;
};
Player(const Player& otherPlayer) {
_firstName = otherPlayer._firstName.c_str();
_lastName = otherPlayer._lastName.c_str();
std::cout << "Created " << _firstName << " " << _lastName << std::endl; // Why doesn't _firstName and _lastName contain anything?
};
std::string GetName() { return _firstName + " " + _lastName; };
};
int main(int argc, const char * argv[])
{
Player player1 = Player("Bill", "Clinton");
Player player2 = Player(player1);
std::cout << "Player: " << player2.GetName() << std::endl;
return 0;
}
输出是微不足道的Player:
。我不确定为什么我的复制构造函数没有做我想做的事情,特别是考虑到诸如this(Zac Howland的c_str();
部分的评论帐户)之类的建议。我是否违反the rule of three(顺便说一下,我还没有完全理解我的头脑)?如果有人能指出我正确的方向,我真的很感激!
答案 0 :(得分:4)
它对我有用:http://ideone.com/aenViu
我刚刚补充道:
#include <iostream>
#include <string>
但有些事我不明白:
_firstName = otherPlayer._firstName.c_str();
_lastName = otherPlayer._lastName.c_str();
为什么.c_str()
?您将string
转换为char*
以将其分配给新的string
?
编辑:从评论中,Zac Howland指出:“在C ++ 11之前,如果你想确保你的字符串被复制(而不是引用计数),你必须使用c_str()
方法强制它复制字符串。新标准消除了这一点,但如果他使用较旧的编译器,或尚未完全实现C ++ 11的编译器,它将确保深度复制。“
只是做:
_firstName = otherPlayer._firstName;
_lastName = otherPlayer._lastName;
而且,你真的需要这个拷贝构造函数吗?默认会做你想要的我认为......
此外,不是分配成员:
Player(std::string firstName, std::string lastName) {
_firstName = firstName;
_lastName = lastName;
}
使用 member-initialization-list 代替:
Player(std::string firstName, std::string lastName) :
_firstName( std::move(firstName) ),
_lastName( std::move(lastName) )
{}
在第一种情况下,调用字符串的默认构造函数,然后调用字符串的复制赋值运算符,与第二种情况相比,肯定存在(次要)效率损失,直接调用复制构造函数。
最后,当可能时,不会将值作为方法参数传递,在不需要修改时传递引用甚至const引用:
Player( const std::string& firstName, const std::string& lastName )
// ^^^^^ ^ ^^^^^ ^
: _firstName( firstName ) // no move here, since args are constant references
, _lastName( lastName )
{}
所有修改工作live example。