stl字符串返回const引用与const char *

时间:2010-05-20 03:33:34

标签: c++

我的班级中有一个STL字符串成员变量,

class A {
public:
   const char* getData1() const { return data.c_str());
   const string& getData2() const { return _data; }
private:
   string _data;
};

getData1()getData2(),哪一个更好?

4 个答案:

答案 0 :(得分:5)

返回字符串引用的那个是两个选择中较好的一个。如果在内部更改字符串,则先前返回的字符串引用仍然有效,但const char *可能不会有效。

比这些选择中的任何一个都更好,只能按价值返回。

std::string getData3() const { return data_; }

另外,我建议不要在变量前面添加下划线,并删除using namespace std;语句。

答案 1 :(得分:1)

两者都有点危险,因为你的对象可能超出范围,或者它的内存可能被释放。但是你仍然会有一个指针或对其中一个成员的引用。

如果你真的想这样做,那只取决于你是否想要访问字符串方法。此外c_str()的{​​{1}}可能是将释放给你的记忆。

如果const char*不是那么大,可能只返回_data,而不是string

答案 2 :(得分:1)

通常我更喜欢getData2()const char*方法返回的c_str()只能在不调用data的非const方法时使用。之后,const char*的内容未定义。通过返回const char*,您正在掩盖此问题。如果该类的用户需要使用C风格的字符串,他可以在返回的c_str()上自己调用const string&

这里我们还假设getData2()的用户合理地假设只要类A的对象尚未被销毁,返回的引用才可用于他。

答案 3 :(得分:0)

返回const string&会更好。如果您需要const char*,则可以致电getData2().c_str(),这与getData1()实际上完全相同。

记住std::stringconst char*字符串更好,因为它们存储长度,而不是空终止。这意味着如果要获取该字符串的长度,strlen(getData1())是O(n)操作,但getData2().length()是O(1)操作。