我的班级中有一个STL字符串成员变量,
class A {
public:
const char* getData1() const { return data.c_str());
const string& getData2() const { return _data; }
private:
string _data;
};
getData1()
与getData2()
,哪一个更好?
答案 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::string
比const char*
字符串更好,因为它们存储长度,而不是空终止。这意味着如果要获取该字符串的长度,strlen(getData1())
是O(n)操作,但getData2().length()
是O(1)操作。