将通过引用传递的值赋值给成员变量(在C+;+;) 我试图在C++中概括一下范围。请考虑以下事项: class C { int i_; public: C() { i_ = 0;} C(int i) { i_ = i; } C(const C &c) { i_ = c.i_; cout << "C is being copied: " << i_ << endl; } int getI() { return i_; } ~C() {cout << "dstr: " << i_ << endl;} }; class D { C c_; public: void setC(C &c) { c_ = c; } int getC_I() { return c_.getI(); } }; void Test(D &d) { C c(1); d.setC(c); //here c is going out of scope, surely it will be destroyed now? } int main() { D d; Test(d); //this sets value of c_ to the local variable in Test. //Surely this will be invalid when Test returns? int ii = d.getC_I(); cout << ii << endl; } C类 { 国际组织; 公众: C() C(inti){i_uui=i;} C(施工C&C){ i=c.i; 库特

将通过引用传递的值赋值给成员变量(在C+;+;) 我试图在C++中概括一下范围。请考虑以下事项: class C { int i_; public: C() { i_ = 0;} C(int i) { i_ = i; } C(const C &c) { i_ = c.i_; cout << "C is being copied: " << i_ << endl; } int getI() { return i_; } ~C() {cout << "dstr: " << i_ << endl;} }; class D { C c_; public: void setC(C &c) { c_ = c; } int getC_I() { return c_.getI(); } }; void Test(D &d) { C c(1); d.setC(c); //here c is going out of scope, surely it will be destroyed now? } int main() { D d; Test(d); //this sets value of c_ to the local variable in Test. //Surely this will be invalid when Test returns? int ii = d.getC_I(); cout << ii << endl; } C类 { 国际组织; 公众: C() C(inti){i_uui=i;} C(施工C&C){ i=c.i; 库特,c++,scope,pass-by-reference,C++,Scope,Pass By Reference,c在哪里复制的 当您执行c时,您正在调用c上的operator=,它将c的内容复制到c 如果c\uu也是一个引用,则不会复制任何内容,并且程序将导致与您预期的一样的错误。c在此处被复制: void setC(C &c) { c_ = c; } 如果您想存储引用,那么您的成员变量c也应该是引用。如果您要存储引用,那么您必须小心您要传递的变量的生存期。您的代码现在就可以了。D::c是c类型,而不是c&。您的SetC引用一个C,并将该引用引用的值赋给C::C \,因此您拥有的是一个具有相同值

c在哪里复制的

当您执行
c
时,您正在调用
c
上的
operator=
,它将
c
的内容复制到
c


如果
c\uu
也是一个引用,则不会复制任何内容,并且程序将导致与您预期的一样的错误。

c在此处被复制:

void setC(C &c) { c_ = c; }

如果您想存储引用,那么您的成员变量
c
也应该是引用。如果您要存储引用,那么您必须小心您要传递的变量的生存期。

您的代码现在就可以了。
D::c
c
类型,而不是
c&
。您的
SetC
引用一个C,并将该引用引用的值赋给
C::C \
,因此您拥有的是一个具有相同值的完全独立的
C
对象。由于您在
main
中创建了具有自动存储持续时间的
d
,因此它和
C \/code>作为其一部分仍然有效在退出
main

@Charles之前,标准规定“类对象可以通过两种方式复制,通过初始化[…]和赋值(5.17)。从概念上讲,这两种操作是由复制构造函数(12.1)和复制赋值操作符(13.5.3)实现的。”@litb:Fair point,我收回了我最初的评论和回答。