返回指针,返回值或传入引用,这在C ++中很优雅?

时间:2014-02-12 05:01:53

标签: c++ pointers reference return

我对如何处理打算返回类对象的函数感到困惑。

这里我有一个函数connect,它接受​​一个char数组形式的url,然后创建一个Response类对象,它包含访问此url返回的响应。

1>按值返回响应是最直接的,但是人们说复制构造函数会使值返回缓慢:

Response connect(char *); // declaration of connect  
Response resp = connect(url_str);  

2 - ;通过指针返回响应也很容易阅读,但需要处理删除connect之外的指针:

Response * connect(char *);  // declaration of connect  
Response * resp = connect(url_str);  

3>在调用connect之前声明类Response的对象并通过引用将其传递给connect有助于降低内存泄漏的风险,并且比按值返回更快,但这会使代码违反直觉:

void connect(char *, Response &); // declaration of connect  
Response resp;  
connect(url_str, resp);  

你将如何在C ++中处理这种情况?欢迎任何建议或经验。

4 个答案:

答案 0 :(得分:3)

按价值返回。

这是最简单,最容易做到的,并且对你的函数的调用者负责。

理论上它的效率较低(你需要原始构造函数和复制构造函数),但C ++标准特别允许所谓的return value optimisation,因此可以避免复制。您可能使用的每个C ++编译器都将执行此优化。

答案 1 :(得分:0)

您可以创建一个具有load(const char * url)方法的'response'对象:

response somepage;
somepage.load( "http://www.google.com" );

答案 2 :(得分:0)

答案完全取决于Response类结构和用例。 如果类没有很多数据,很少使用或者你不太关心性能 - 你可以只返回一个类对象。这很简单,但不是很有效。

纯粹的方式2是危险的,因为你必须关心记忆。在这种情况下更好的方法是使用smart pointers。此外,如果操作失败,您可以返回nullptr

方式3是常见做法。但是您可能需要Response中的特殊方法来了解它是否已成功连接。

答案 3 :(得分:0)

关于这个问题的一个很好的参考资料可以在Scott Meyers的Effective C ++第3版第21项中找到。