0

这可能是显而易见的,但我有点难过。我的向量表现不佳时遇到了一些麻烦,现在看来我找到了罪魁祸首。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:。我不确定为什么我的复制构造函数没有做我想要它做的事情,特别是考虑到这样的建议 Zac Howland 的评论说明了c_str();-part)。我是否违反了三规则(顺便说一句,我还没有完全理解)?如果有人能指出我正确的方向,我将不胜感激!

4

1 回答 1

4

它对我有用:http: //ideone.com/aenViu

我刚刚添加:

#include <iostream>
#include <string>

但是有一点我不明白:

_firstName = otherPlayer._firstName.c_str();
_lastName = otherPlayer._lastName.c_str();

为什么.c_str()?您将stringto转换为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;
}

改用成员初始化列表

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 )
{}

所有修改的工作实例

于 2013-08-21T20:44:23.717 回答