我对如何处理打算返回类对象的函数感到困惑。
这里我有一个函数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 ++中处理这种情况?欢迎任何建议或经验。
答案 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项中找到。