考虑以下代码:
class Test
{
public:
int data;
Test() { data = 9; }
Test myfunction ();
void print() { cout << data<<endl; }
};
Test m;
Test Test::myfunction ()
{
return m;
};
int main()
{
Test b;
Test a;
b=a.myfunction();
b.print();
return 0;
}
即使i 仅用以下内容替换功能,输出也保持不变(我不会更改主要部分内的任何内容)。为什么会这样?
class Test
{
public:
int data;
Test() { data = 9; }
Test& myfunction ();
void print() { cout << data<<endl; }
};
Test m;
// function replaced and now it has reference return
Test& Test::myfunction ()
{
return m;
};
int main()
{
Test b;
Test a;
b=a.myfunction();
b.print();
return 0;
}
两种情况之间的差异是什么? 我没有多少参考,所以请详细解释。
在每种情况下,两种编译都很好,输出为: 9
答案 0 :(得分:2)
在第一个代码段中,您将返回全局实例m
的副本。在您的情况下,编译器会生成一个普通的复制构造函数,它将复制您的成员data
。此外,您还会生成一个琐碎的普通复制分配操作符,它会将结果复制到b
,同时自动复制您的成员data
。
第二个版本返回对全局实例m
的引用。从这一点来看,它与第一种情况相同:结果被分配给b
。它只是Test
的一个复制操作。
答案 1 :(得分:1)
您创建的所有对象都使用默认构造函数,该构造函数指定data = 9。没有代码可以将data
更改为其他任何内容。所以除了9
在第一种情况下,按值返回时,对象是复制构造的。由于您未提供显式复制构造函数,因此data
将按原样复制。
添加此项以查看不同的输出
Test(const Test& lhs){ data = 22; }
您希望看到的输出是什么?或者哪一部分参考令人困惑?