鉴于以下内容:
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的副本吗?
谢谢!
丹
答案 0 :(得分:7)
由于_myPrivate
不是引用,因此在作业_myPrivate = param
中,其值将从引用param
指向的任何内容中复制,这种情况是p
中的局部变量some_function()
。
所以如果ParamClass
的赋值运算符正确实现,代码应该没问题。
我仍然可以使用_myPrivate来访问对象p的副本吗?
有了上述警告,是的。但准确地说,_myPrivate
不能用于访问 p
的副本; 是一个变量,其中包含(现已灭绝)p
中的数据副本。
答案 1 :(得分:0)
在myMethod
中,您调用ParamClass
的赋值运算符,默认情况下会生成对象的按位副本(您可以定义自己的运算符)。所以你创建了一个p的副本,可以访问
答案 2 :(得分:0)
引用就像是对象的别名。该引用没有自己的生命周期。要考虑的生命周期是引用对象的生命周期。
在您的示例中,_myPrivate是一个对象,因此operator =将复制引用传递的objet p。 p将被销毁,参数引用将不引用任何内容,但_myPrivate,作为副本将是正常的。
如果将_myPrivate声明为:
,那将是一个问题ParamObject& _myPrivate;
在这种情况下,您最终会得到一个“悬空”引用:未定义的行为:)
MY2C
答案 3 :(得分:0)
看看:
_myPrivate = param;
在此语句中,赋值运算符(ParamClass::operator=
)将param
引用的对象的每个成员的值复制到_myPrivate
的成员中。当some_function
返回时,p
从堆栈中移出 - 它会消失。但是_myPrivate
现在包含p
成员值的副本。
如果ParamClass
的成员指向动态分配的内存,则必须确保ParamClass::operator=
执行深层复制,否则您可能会遇到悬挂指针的问题 - { {1}}析构函数可能会释放内存,但ParamClass
会有一个仍然指向它的成员!