为 class 成员返回 const std::string& 与 const char*

Returning const std::string& vs const char* for class member

考虑以下 class 示例:

class AClass
{
    std::string myString;

    public:
    ...
}

使用以下访问器之一:

const std::string& GetMyString() const
{
    return myString;
}

对比

const char* GetMyString() const
{
    return myString.c_str();
}

考虑到 myString 被初始化一次并且永远不会改变,哪个访问器更好?第一个,还是第二个?在什么情况下其中一个比它的邻居更合适?

版本 returning const std::string& 涵盖了 returning const char* 用例的超集(毕竟,可以通过调用将其转换为后者.c_str() 在 return 值上),没有增加弱点。鉴于 std::string 在其他方面更灵活,我更喜欢两个选项中的 const std::string&

也就是说,如果所讨论的拥有对象不是不朽的,他们都会很尴尬;即使字符串从未更改,如果对象本身消失,对其字符串的引用现在也无效。如果可能的话,您可能想要:

  1. Return 按值

  1. 使用 std::shared_ptr<std::string> 成员和 return 成员(因此字符串的生命周期不再与创建它的对象的生命周期相关联)