克里斯提到使用成員函數,這樣的復位或清除對象:
mylist tmp = classList;
classList.clear();
return tmp;
但你通常可以做的更好,避免在首位的副本。
mylist tmp;
std::swap(tmp,classList);
return tmp;
另外,我會擔心隨時釋放或者返回的變量或班級列表變量或將RIAA照顧這一切給我嗎?
你不需要delete
資源,除非你在new
他們的某個地方。如果你使用new
,那麼你也應該使用智能指針,所以你仍然不需要delete
任何東西。
有關C++來自Java的最重要的事情之一就是C++對象默認是類似於值的對象。那就是:
class A {
bool bar_called;
public:
A() : bar_called(false) {}
void bar() { bar_called = true; }
bool has_bar_been_called_on_this_object() { return bar_called; }
};
void foo(A a) {
a.bar();
}
int main() {
A a;
foo(a);
std::cout << a.has_bar_been_called_on_this_object() << '\n';
}
輸出將指示杆沒有被封爲a
。Java使用,但試圖隱藏,指針。所以一旦你弄清楚C++中的指針應該對你更有意義,然後你將能夠弄清楚如何使用指針而不是。
Object o = new Object(); // Java hides the fact that o is a pointer to an Object, but fails to hide the consequences
Object b = o; // b is a pointer to an object, the same Object o points to.
// Equivalent C++
Object *o = new Object();
Object *b = o;
從C++代碼來看你介紹,在Java中你會做你的詢問像這樣的內容:
mylist tmp = classList;
classList = new mylist();
return tmp;
在C++中的等效是:
mylist *tmp = classList; // classList is a pointer to a new'd up list.
classList = new mylist();
return tmp;
但這不是idomatic C++。在C++中,你通常不希望使用指針,如果你想使用智能指針
std::shared_ptr<mylist> tmp = classList; // classList is a std::shared_ptr<mylist>
classList = std::make_shared<mylist>();
return tmp;
或
std::unique_ptr<mylist> tmp = std::move(classList); // classList is a unique_ptr
classList = std::unique_ptr<mylist>(new mylist()); // careful here, don't go calling a bunch of functions inside the mylist initializer, it's dangerous for reason beyond the scope of this post
return tmp;
但C++的辦法就是真正完全避免指針。
mylist tmp; // classList is not a pointer at all
std::swap(tmp,classList); // the values of classList and tmp are swapped
return tmp; // tmp is returned by value, tmp has the same value as classList, but is not the same object, tmp and classList are objects, not pointers to objects as they are in Java or in the above C++ examples.
我有一個引人注目的猜疑,你可能沒有看太深入指針與引用。請原諒我,如果你有,但[這個問題](http:// stackoverflow。com/questions/57483 /指針變量與參考變量之間的差異在c中)解釋得非常好。 – chris