C++ C++;类对象的引用返回为什么不调用复制构造函数?
考虑以下处理引用返回的代码:C++ C++;类对象的引用返回为什么不调用复制构造函数?,c++,C++,考虑以下处理引用返回的代码: class Test { public: int data; Test() { data = 0; } Test(int u) { data = u;} Test& myfunction ();// function returning reference Test(Test& b) // copy constructor { cout<<"consructo
class Test
{
public:
int data;
Test() { data = 0; }
Test(int u) { data = u;}
Test& myfunction ();// function returning reference
Test(Test& b) // copy constructor
{
cout<<"consructor called";
}
void print() { cout << data<<endl; }
};
Test m(97);
Test& Test:: myfunction ()
{
return m;
};
int main()
{ Test a;
Test b;
b=a.myfunction();// why copy constructor not called?
b.print();
m.data=5;
b.print();// if b is a reference of m then why its value not changed?
return 0;
}
如果是这样的话,那么当'm'的值在
m.data=5;
2) b是正常对象吗?。如果是这样,那么为什么在执行以下代码时不调用复制构造函数
b=a.myfunction();
上述代码可以通过以下输出进行编译:97
五, 您刚刚使用
Test
的默认构造函数构造了b
对象。你所做的一切都不会以某种方式神奇地“重建”b
。您现在使用b
所做的一切都是在已构建的b
上完成的
b=a.myfunction();// why copy constructor not called?
未调用复制构造函数,因为未构造任何内容。由于要将某些内容分配给已构造的对象,因此将调用该对象的复制分配操作符(操作符=
)
现在,如果要确保调用复制构造函数,则应执行以下操作:
Test b = a.myfunction();
is'b'成为'm'的参考 否。您已将
b
声明为Test
对象。一旦一个对象被声明,您所做的任何事情都不会改变它的类型。对象创建后不会更改类型
由于myfunction()
返回一个引用,b
的赋值运算符将其用作右侧。它没有将b
作为引用——它只是从myfunction()
返回的东西中复制东西,而这恰好是对其他东西的引用
b是普通物体吗
对。老实说,我不知道你说的“普通物体”到底是什么意思,但不管你是什么意思,答案肯定是肯定的。它不是一个引用,并且没有关于<代码> B<代码>的任何魔法(或者C++中的任何东西,虽然看起来是这样)。
对象B已经在上面的行中构建了,所以它不会调用复制构造函数,而是赋值操作符。
// Using copy constructor:
Test a;
Test b = a.myfunction();
// Using assignment operator
Test c;
c = a.myfunction();
b
不是参考。作为引用的返回类型不会改变这一事实。1)正如chris所说,b
不是引用2)在b
上调用Test
的复制赋值操作符(它与复制构造函数不同)@chris如果“b”不是对“m”的引用,因此是一个普通对象,那么为什么不调用复制构造函数?@user3249833:因为b
已经被构造。请看我的答案。@john Dibling是否有任何方法可以通过Myfunction返回引用并将其分配给“b”?为什么下面的代码不起作用Test Test::Myfunction(){return m;}
我想返回一个Test objectwhy下面的代码不起作用Test Test::myfunction(){return m;}代码>我想返回一个测试object@user3249833具体点。你期望它做什么?实际上我想通过'Myfunction'返回一个引用,并将其分配给'b'。(因此b变成了对m的引用)有什么办法吗。。?
Test b = a.myfunction();
// Using copy constructor:
Test a;
Test b = a.myfunction();
// Using assignment operator
Test c;
c = a.myfunction();