Bea*_*kie 1 c++ operator-overloading assignment-operator
我有一个结构,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;
}
};
Run Code Online (Sandbox Code Playgroud)
我这样称呼它
Foo baz = fooFunc();
Run Code Online (Sandbox Code Playgroud)
(似乎)如果我在函数(fooFunc)中创建一个Foo(f)实例并返回它,则在返回值之前调用析构函数,因为我丢失了_BarList的内容.
这在函数中创建是有意义的.这是一个例子.
Foo fooFunc()
{
Foo f = Foo();
return f;
}
Run Code Online (Sandbox Code Playgroud)
如果我在返回时直接返回Foo的实例,则直到调用了equals运算符之后才调用该项的析构函数(通过调用行上的equals语句).
Foo fooFunc()
{
return Foo();
}
Run Code Online (Sandbox Code Playgroud)
我想这是有道理的,因为我在对象中创建Foo,并且在返回对象之前清除了一些东西.
我想我可以通过这样做返回来解决这个问题(在编写一个新的构造函数来获取Foo之后):
Foo fooFunc()
{
Foo f = Foo();
return Foo(f);
}
Run Code Online (Sandbox Code Playgroud)
1)我的假设是对的吗?
2)是否有另一种方法可以不需要这么多的重复赋值运算符?
编辑:请考虑这个函数通常会做的不仅仅是返回Foo()!
你的班级违反了三条规则.您有一个析构函数和一个复制赋值运算符,但没有复制构造函数.而默认的一个绝对不能满足您的需求.
并注意所有这些行:
Foo f = Foo();
return Foo(f);
Foo baz = fooFunc();
Run Code Online (Sandbox Code Playgroud)
使用复制构造函数,而不是赋值运算符.赋值运算符仅用于分配现有对象,从不用于创建/初始化新对象.
| 归档时间: |
|
| 查看次数: |
315 次 |
| 最近记录: |