为什么我的复制构造函数不起作用?

时间:2013-08-21 20:37:59

标签: c++ copy-constructor stdstring

这可能是一个明智的选择,但我有点难过。我的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(顺便说一下,我还没有完全理解我的头脑)?如果有人能指出我正确的方向,我真的很感激!

1 个答案:

答案 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