繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM