考虑以下处理引用返回的代码:
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;
}
我有两个问题
1)是'b'通过以下方式成为'm'的引用:
b=a.myfunction();
如果是这样,那么为什么当'm'的值在
m.data=5;
2)是b的正常对象吗? 。如果是这样,那么为什么在执行以下代码时未调用复制构造函数
b=a.myfunction();
上面的代码可以通过以下输出进行编译:
97
5
最佳答案
Test b;
您只是使用
b
的默认构造函数构造了Test
对象。您所做的任何事情都不会以某种方式神奇地“重构” b
。现在,您对b
进行的所有操作都在已经构造好的b
上完成。b=a.myfunction();// why copy constructor not called?
不会调用拷贝构造函数,因为没有任何构造。由于您要为已经构造的对象分配内容,因此将调用对象的副本分配运算符(
operator=
)。现在,如果要确保调用了复制构造函数,则应改为:
Test b = a.myfunction();
否。您已经声明
b
为Test
对象。声明对象后,您无需执行任何操作即可更改其类型。对象一旦创建就不会更改类型。由于
myfunction()
返回引用,因此b
的赋值运算符将其用作右侧。它并没有使b
成为引用,它只是从myfunction()
返回的东西中复制东西,而这恰好是对其他东西的引用。是。好吧,老实说,我不知道您所说的“正常物体”到底是什么意思。但是,无论您怎么说,答案肯定是肯定的。它不是引用,而且
b
(或C++中的其他任何内容,虽然看起来似乎如此)都没有什么神奇之处。