[英]stl string return by const reference vs. const char*
我在课堂上有一个STL字符串成员变量,
class A {
public:
const char* getData1() const { return data.c_str());
const string& getData2() const { return _data; }
private:
string _data;
};
getData1()
与getData2()
哪个更好?
返回字符串引用的是这两种选择中较好的一种。 如果在内部更改了字符串,则先前返回的字符串引用仍然有效,但是const char *
可能无效。
比这些选择中的任何一个更好的是仅按价值返回。
std::string getData3() const { return data_; }
另外,我建议不要在变量前加下划线,并using namespace std;
消除该前缀using namespace std;
声明。
两者都有些危险,因为您的对象可能超出范围,或者可能释放了其内存。 但是您仍将具有指向其成员之一的指针或引用。
如果您确实要执行此操作,则仅取决于您是否要访问字符串方法。 同样, c_str()
的const char*
可能是将在您身上释放的内存。
如果_data
没那么大,也许只返回一个string
,而不是const string&
。
通常我更喜欢getData2()
。 只要不调用data
的非const方法,就只能使用c_str()
方法返回的const char*
。 之后, const char*
的内容未定义。 通过返回const char*
,可以掩盖此问题。 如果该类的用户需要使用C样式的字符串,则可以自己对返回的const string&
调用c_str()
。
在这里,我们还假设getData2()
的用户合理地假定返回的引用仅对他可用,只要该类A
的对象尚未销毁即可。
返回一个const string&
更好。 如果需要const char*
,则可以只调用getData2().c_str()
,它实际上与getData1()
作用相同。
请记住, std::string
优于const char*
字符串,因为它们存储长度,而不是以null终止。 这意味着,如果要获取该字符串的长度, strlen(getData1())
是O(n)操作,而getData2().length()
是O(1)操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.