c++ - 在 C++ 中创建对象的函数

标签 c++ function oop object pointers

我目前正在学习如何在 C++ 中使用函数操作对象,到目前为止我已经达到以下几点:

如果您的对象可能很大,请不要将其设为局部变量,即将其保存在堆中以节省复制时间。

具体来说,我对这样一种情况很感兴趣,在这种情况下,我们正在使用一个函数来创建一个以前不存在的对象。 我整理了以下小示例来展示如果您有一个函数该怎么做:

#include <iostream>
using namespace std;

struct obj {
    int first;
    int second;
};


void setFirstVersionA(int a, obj * s)
{
    s->first = a;
}

obj * setFirstVersionB(int a)
{
    //in Version B I am creating a new object in the function but have to run delete outside
    obj * s = new obj();
    s->first = a;
    return s;
}


int main(int argc, const char** argv)
{
    obj * myobj = new obj();
    setFirstVersionA(2,myobj);
    //now I have the new obj in *i
    cout << myobj->first;
    delete myobj;

    //this is an alternative to passing a pointer directly:

    //no need to re-declare the pointer as delete only erases the myobj data
    myobj = setFirstVersionB(3);
    //now I have the new obj in *i
    cout << myobj->first;
    delete myobj;

    return 0;
}

据我所知,这两个函数实现了相同的结果。

我更喜欢 A 版,因为它没有分隔新的和删除的声明,并且让我不太容易在完成后忘记删除对象。但它是一个返回类型 void,我发现代码的可读性较差,因为我必须实际检查函数的作用(通常这意味着读取其他文件)。

我更喜欢版本 B,因为它返回了我想要更改的“东西”。所以我立即知道,这个函数改变了那个人(在本例中是 obj s)。但是它分开,新建和删除。老实说,我发现我的代码中有一系列 void 函数并且没有立即看到它们的作用并不可怕。 此外,这里已经写了很多关于不返回指向局部变量的指针,但在变体 B 中,尽管对象是在函数内创建的,但它不是局部变量(因为它位于堆中)。对吧?

有更好的方法吗? 此外,“创建以前不存在的对象的函数”听起来很像构造函数。 :) 我是否应该为我的每个对象创建一个带有构造函数的类?

感谢您的建议!

最佳答案

正确的方法可能是创建一个将值作为参数的构造函数:

struct obj
{
    obj(int f) : first(f) {}
    // ...
};

// ...

obj myobj(2);

或者有一个setter函数:

struct obj
{
    void set_first(int f) { first = f; }
    // ...
};

// ...

obj myobj;
myobj.set_first(2);

上述方法当然可以组合,所以你们都有一个专门的构造函数和一个 setter 方法。

虽然 setter 方法可能会被跳过,因为您使用的是仅包含公共(public)成员变量的结构。

关于c++ - 在 C++ 中创建对象的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17809603/

相关文章:

c++ - 在我的案例中,我是否需要销毁单例实例?

javascript - 如何重新定义关于闭包的JS函数?

matlab - 只返回奇数元素

c++ - Cpp 中的私有(private)静态数据成员.. 只能在其定义时初始化,而类内初始化无效?

c# - 构建灵活且可重用的类层次结构

python - 如何在 Visual Code 中设置 launch.json 来调试 C

c++ - 从文件加载图像(任何 pc 都可以)C++ Builder

c++ - 读取pcap捕获文件崩溃

jquery - 单击任意位置即可删除类(class)

php - 任何 PHP 函数会去除对象的空属性?