C++ 参考参数寿命

C++ 参考参数寿命,c++,object-lifetime,C++,Object Lifetime,鉴于以下情况: class ParamClass {...}; class MyObject { public: void myMethod(ParamClass const& param) { _myPrivate = param; } private: ParamClass _myPrivate; } [...] MyObject obj; void some_function(void) { ParamClass p(...); obj.m

鉴于以下情况:

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的副本吗

谢谢


Dan

由于
\u myPrivate
不是一个引用,在赋值
\u myPrivate=param
中,它的值将从引用
param
指向的任何对象复制过来,在这种情况下,它是
某些函数()
中的局部变量
p

因此,如果
ParamClass
的赋值运算符实现正确,代码应该是正确的

我仍然能够使用_myPrivate访问对象p的副本吗


根据上述警告,是的。但准确地说,
\u myPrivate
不能用于访问
p
的副本;它是一个变量,包含(现在已消失的)
p
中的数据副本,在
myMethod
中,您调用
ParamClass
的赋值运算符,默认情况下,该运算符生成对象的逐位副本(您可以定义自己的运算符)。因此,您可以创建一个p的副本,该副本可以访问

引用就像对象的别名。引用本身没有生存期。要考虑的生命周期是引用的对象的生命周期。

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

如果_myPrivate被声明为:

ParamObject& _myPrivate;
在这种情况下,您将得到一个“悬空”引用:未定义的行为:)

my2c

看看:

\u myPrivate=param

在此语句中,赋值运算符(
ParamClass::operator=
)将
param
引用的对象的每个成员的值复制到
\u myPrivate
的成员中。当
some_函数
返回时,
p
从堆栈中移出-它消失。但是
\u myPrivate
现在包含
p
成员值的副本


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

它使成员逐个复制,而不是按位复制