2

鉴于以下情况:

class ParamClass {...};

class MyObject {
public:
    void myMethod(ParamClass const& param) { _myPrivate = param; }

private:
    ParamClass _myPrivate;
}

[...]

MyObject obj;

void some_function(void)
{
    ParamClass p(...);
    obj.myMethod(p);
}

在对象 p 的生命周期结束时 _myPrivate 会发生什么?编辑:我仍然可以使用 _myPrivate 访问对象 p 的副本吗?

谢谢!

4

4 回答 4

7

由于_myPrivate不是引用,因此在赋值_myPrivate = param中,它的值将从引用param指向的任何地方复制过来,在这种情况下,它是 中的局部变量psome_function()

因此,如果正确实现了赋值运算符ParamClass,代码应该没问题。

我仍然可以使用 _myPrivate 访问对象 p 的副本吗?

有了上述警告,是的。但准确地说,_myPrivate不能用来访问副本p;它一个变量,包含(现已灭绝)中的数据副本p

于 2011-02-01T14:59:02.693 回答
0

myMethod您调用赋值运算符时ParamClass,默认情况下该运算符会按位复制对象(您可以定义自己的运算符)。所以你创建了一个 p 的副本,它可以被访问

于 2011-02-01T14:59:44.970 回答
0

引用就像对象的别名。引用没有自己的生命周期。要考虑的生命周期是所引用对象的生命周期。

在您的示例中, _myPrivate 是一个对象,因此 operator= 将复制引用传递的对象 p。p 将被销毁,并且参数引用将不引用任何内容,但 _myPrivate,作为副本就可以了。

如果 _myPrivate 被声明为:

ParamObject& _myPrivate;

在这种情况下,您最终会得到一个“悬空”引用:未定义的行为:)

my2c

于 2011-02-01T15:11:27.677 回答
0

看一眼:

_myPrivate = param;

在此语句中,赋值运算符 ( ParamClass::operator=) 将引用的对象的每个成员的值复制param到 的成员中_myPrivatesome_function返回时,从p堆栈中移出 - 它消失了。但_myPrivate现在包含p“成员”值的副本。

如果ParamClass有成员是指向动态分配的内存的指针,则必须确保ParamClass::operator=执行deep copy,否则您可能会遇到悬空指针的问题 -ParamClass的析构函数可能会释放该内存但_myPrivate仍会有一个成员指向它!

于 2011-02-01T15:24:56.810 回答