【发布时间】:2014-11-27 04:57:57
【问题描述】:
我有一个结构体 Foo,其指针数组为 Bar。
struct Foo
{
Bar* _BarList;
Foo()
{
_BarList = new Bar[1];
_BarList[0] = Bar(10, 20);
}
Foo& operator=(const Foo& foo)
{
Bar* tmpBarList = new Bar[1];
tmpBarList[0] = foo._BarList[0];
delete[] _BarList;
_BarList = tmpBarList;
return *this;
}
~Foo()
{
delete[] _BarList;
}
};
我这样称呼它
Foo baz = fooFunc();
(似乎)如果我在函数 (fooFunc) 中创建 Foo (f) 的实例并返回它,则在返回值之前调用析构函数,因为我丢失了 _BarList 的内容。
这是有道理的,因为它是在函数中创建的。这是一个例子。
Foo fooFunc()
{
Foo f = Foo();
return f;
}
如果我在返回时直接返回 Foo 的一个实例,则在调用 equals 运算符(通过调用行上的 equals 语句)之前,不会调用该项目的析构函数。
Foo fooFunc()
{
return Foo();
}
我认为这是有道理的,因为我在对象内部创建 Foo,并且在返回对象之前清除了所有内容。
我想我可以通过这样的返回来解决这个问题(在编写一个新的构造函数来获取 Foo 之后):
Foo fooFunc()
{
Foo f = Foo();
return Foo(f);
}
1) 我的假设是否正确?
2) 是否有另一种不需要调用这么多重复赋值运算符的方法?
编辑:请考虑这个函数通常会做的不仅仅是返回 Foo()!
【问题讨论】:
标签: c++ operator-overloading assignment-operator