克里斯提到使用成员函数来重置或清除对象,如下所示:
mylist tmp = classList;
classList.clear();
return tmp;
但是您通常可以通过首先避免复制来做得更好。
mylist tmp;
std::swap(tmp,classList);
return tmp;
另外,我是否需要担心随时释放返回的变量或 classList 变量,或者 RIAA 会为我处理这一切?
你不需要delete
资源,除非你new
在某个地方。如果你确实使用new
了,那么你也应该使用智能指针,这样你仍然不需要delete
任何东西。
了解来自 Java 的 C++ 的最重要的事情之一是 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';
}
输出将指示 bar尚未被调用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;
然而,这不是惯用的 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.