我目前正在学习如何在 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/