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

标签 c++ oop

<分区>

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

假设您有一个创建新对象并返回该对象的函数。最好的方法是什么? 我找到了 3 种不同的解决方案。

方案一使用拷贝构造函数

MyClass getMyClass() {
    MyClass obj;
    //work with obj, set values...
    return obj;
}

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

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

MyClass* getMyClass() {
    MyClass* obj = new MyClass();
    //work with obj, set values...
    return obj;
}

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

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

MyClass getMyClass(MyClass& obj) {
    //work with obj, set values...
    return obj;
}

您创建一个默认对象并在该函数中设置所有值。

我还想过使用 unique_ptr<MyCLass>但存在同样的问题,即 unique_ptr当离开函数作用域时被销毁。

最佳答案

解决方案 1 不使用复制构造函数,而是使用 return value optimization .这意味着在函数中构造的对象实际上并没有被复制而是直接传递给了函数的调用者。解决方案 1 是一个很好的选择,我建议将其用于不会在堆栈上占用太多空间的非多态对象(即无继承)。

多态对象的首选方法是解决方案 2。但始终要考虑谁拥有您的对象,即谁负责调用 delete。一个好的替代方法是使用 shared_ptrunique_ptr

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

关于c++ - 返回 C++ 对象 - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23384459/

相关文章:

C++ 设计 : Pool and pointers VS client-server

c++ - 在函数中创建类实例并稍后使用它

c++ - 将引用作为参数传递给抽象类中的方法

c++ - OpenGL gl*Pointer 函数有什么作用

c++ - 打印带有千位和百万位分隔符的整数

c++ - Boost:API 在 1.46.1 和 1.58.0 之间发生变化?

c++ - 在 C++ 中传递 std::array 作为参数

php - 什么时候需要使用后期静态绑定(bind)?

design-patterns - 是否应该使用 Singleton 设计模式来实现用户界面?

Python:如何创建 "global object"?