對於原語類型這是確定:
int inc(int x) {
return x+1;
}
用於更復雜的類型這樣做是爲了避免額外的複製當函數返回
void reverse_vector(const std::vector<int>& v, std::vector<int>* result) {
if (!result) return;
*result = v;
std::reverse(result->begin(), result->end();
}
// ...
std::vector<int> v;
std::vector<int> reversed;
reverse_vector(v, &reversed);
對於我建議使用升壓堆上分配對象:: shared_ptr的( tr1 :: shared_ptr)庫。然後你可以編寫幾乎和你在java中一樣的代碼。
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
class A {
public:
A(int x, const std::string& str)
: x(x), str(str) {
}
void foo() {
}
private:
int x;
const std::string& str;
};
// ...
boost::shared_ptr<A> a = boost::make_shared<A>(1, "hello");
a->foo();
您可以將boost :: shared_ptr對象視爲java引用。沒有垃圾收集(只是引用計數),所以你必須關心自己的週期。
請記住,shared_ptr比標準指針稍慢。
另外重要的是要記住,您應該避免複製大對象。這是更好,除非你需要海峽的副本FOO寫的
void foo(const std::string& str);
代替
void foo(std::string str);
。
還有一件事是編譯器很聰明,會爲你做一些優化。例如reverse_vector可以寫成
std::vector<int> reverse_vector(std::vector<int> v) { // note copying!
std::reverse(v.begin(), v.end());
return v; // no additional copying of temporary due to RVO
}
這靜脈阻塞(返回值優化)是非常有用的,但有時編譯器不能自動執行。這就是爲什麼我會建議在不依賴RVO的情況下編寫這類函數,除非您知道它何時失敗。
如果你一次只增加一個,爲什麼不用'operator ++'代替? – 2011-05-22 14:28:38
@Rafe:哪段代碼是「錯誤的」?我只問,因爲[都是](http://codepad.org/YS0FVZGw)[非常好](http://codepad.org/GvMyNc2D)。 – 2011-05-22 14:31:01
我認爲他的同事指的是RAII風格的C++,而不是通過ref傳遞POD類型。基於堆棧的POD類型不需要「內存管理」。 – user7116 2011-05-22 14:31:58