2011-02-01 84 views
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的副本吗?

谢谢!

+0

http://stackoverflow.com/questions/3121781/assigning-value-passed-by-reference-to-a-member-variable-in-c – 2011-02-01 15:01:41

回答

7

由于_myPrivate一个参考,在分配_myPrivate = param,它的值将来自任何所述基准param点,在这种情况下是在some_function()局部变量p被复制。

所以如果ParamClass的赋值运算符正确执行,代码应该没问题。

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

有了上述说明,是的。但确切地说,_myPrivate不能用于访问副本p;它一个变量,其中包含(已经绝迹)p中的数据副本。

0

in myMethod您调用ParamClass的赋值运算符,该运算符默认情况下会对该对象进行按位副本(您可以定义自己的运算符)。所以你创建一个p的副本,这将是可访问的

+1

它使一个构件逐构件副本,而不是按位复制 – CashCow 2011-02-01 15:02:55

0

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

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

ParamObject& _myPrivate; 

在这种情况下,你最终得到一个 “晃荡” 参考:

因为这将是一个问题,如果_myPrivate被宣布未定义行为:)

MY2C

0

取一看:

_myPrivate = param;

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

如果ParamClass有成员是指向动态分配的内存,您必须确保ParamClass::operator=执行深拷贝,否则你可能会与悬摆指针的问题 - ParamClass的析构函数会释放该内存,但_myPrivate将有仍然指向它的成员!