返回C++对象 - 最佳实践

Enn*_*eon 3 c++ oop

我是C++的新手,我遇到了以下问题:

想象一下,您有一个创建新对象并返回此对象的函数.这样做的最佳方法是什么?我找到了3种不同的解决方案.

解决方案1使用复制构造函数

MyClass getMyClass() {
    MyClass obj;
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,你创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象.所以我创建了两个对象,但我只需要一个.是对的吗?

解决方案2在堆上创建对象并使用指针

MyClass* getMyClass() {
    MyClass* obj = new MyClass();
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

这似乎是最糟糕的解决方案,您必须自己进行内存管理.

解决方案3将对象作为参数传递

MyClass getMyClass(MyClass& obj) {
    //work with obj, set values...
    return obj;
}
Run Code Online (Sandbox Code Playgroud)

您可以创建默认对象并在函数中设置所有值.

我也很想使用unique_ptr<MyCLass>但是存在同样的问题,即在unique_ptr保留功能范围时会被破坏.

Dan*_*vil 6

解决方案1不使用复制构造函数,而是返回值优化.这意味着函数中构造的对象实际上没有被复制,而是直接传递给函数的调用者.解决方案1是一个非常好的选项,我推荐用于非多态对象(即没有继承),它不会在堆栈上使用太多空间.

多态对象的首选方法是解决方案2.但总是考虑谁拥有你的对象,即谁负责调用delete.一个很好的选择是使用shared_ptrunique_ptr.

解决方案3并不真正创建对象,只有在创建对象后才能使用它.在这里返回对象也没有意义.