考虑以下代码处理引用返回:
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=a.myfunction();
上面的代码用以下输出编译好:
97个
5
答案 0 :(得分:2)
Test b;
您刚刚使用b
的默认构造函数构造了Test
对象。你所做的一切都不会以某种方式神奇地“重建”b
。您现在使用b
执行的所有操作都已在已构建的b
上完成。
b=a.myfunction();// why copy constructor not called?
未调用复制构造函数,因为没有构造任何内容。由于您正在为已构造的对象分配内容,因此将调用该对象的副本赋值运算符(operator=
)。
现在,如果您想要以确保调用复制构造函数,那么您应该这样做:
Test b = a.myfunction();
是'b'成为'm'的引用
没有。您已将b
声明为Test
个对象。一旦声明了一个对象,你所做的一切都不会改变它的类型。对象在创建后不会更改类型。
由于myfunction()
返回引用,b
的赋值运算符将其用作右侧。它不会使b
成为引用 - 它只是复制myfunction()
返回的东西中的东西,这恰好是对其他内容的引用。
是普通对象吗?
是。好吧,如果我是诚实的,我不知道你的意思是什么“正常对象”。但无论你的意思是什么,答案肯定是肯定的。这不是一个参考,并且b
(或者C ++中的任何其他东西,但它看起来都是如此)没有任何魔力。
答案 1 :(得分:0)
对象b已在上面的行中构造,因此它不会调用复制构造函数,而是调用赋值运算符。
// Using copy constructor:
Test a;
Test b = a.myfunction();
// Using assignment operator
Test c;
c = a.myfunction();