我目前正在学习如何使用 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,因为它没有将 new 和 delete 声明分开,并且使我在完成后不太容易忘记删除对象。但它是一个返回类型 void 并且我发现代码的可读性较差,因为我必须实际检查函数的作用(通常这意味着读取其他文件)。
我更喜欢版本 B,因为它返回了我想要更改的“东西”。所以我立即知道,这个函数改变了那个人(在这种情况下是 obj s)。但它是分开的,新的和删除的。老实说,我觉得比在我的代码中包含一系列 void 函数并且没有立即看到它们的作用更可怕。此外,这里已经写了很多关于不返回指向局部变量的指针,但在变体 B 中,虽然对象是在函数中创建的,但它不是局部变量(因为它位于堆中)。正确的?
有更好的方法吗?此外,“创建以前不存在的对象的函数”听起来很像构造函数。:) 我是否应该为每个对象创建一个带有构造函数的类?
谢谢你的建议!