为 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&
。
也就是说,如果所讨论的拥有对象不是不朽的,他们都会很尴尬;即使字符串从未更改,如果对象本身消失,对其字符串的引用现在也无效。如果可能的话,您可能想要:
- Return 按值
或
- 使用
std::shared_ptr<std::string>
成员和 return 成员(因此字符串的生命周期不再与创建它的对象的生命周期相关联)
考虑以下 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&
。
也就是说,如果所讨论的拥有对象不是不朽的,他们都会很尴尬;即使字符串从未更改,如果对象本身消失,对其字符串的引用现在也无效。如果可能的话,您可能想要:
- Return 按值
或
- 使用
std::shared_ptr<std::string>
成员和 return 成员(因此字符串的生命周期不再与创建它的对象的生命周期相关联)