嗨,我想知道做以下两件事情有什么不同:
template <typename T> class List :
T& getData();
AND
T getData();
};
T
,则T&
是指向T
对象的引用。
T getData();
是一个返回T
对象的函数。这意味着无论函数返回什么,都将被复制,调用者将收到此副本。这称为“通过复制返回”。在实践中,不总是必须产生一份副本,编译器可以优化掉它(称为“复制省略”)。
T& getData();
是一个返回T
对象的引用的函数。这被称为“通过引用返回”,这意味着不会复制返回的对象。相反,您只需返回其在内存中的位置的引用,通过它可以访问原始对象。在使用时,必须注意返回的引用没有超出其所指代的对象的生命周期。A
,其中有一个成员变量int x=1
和一个成员函数int& give() { return x; }
。如果我们现在在main()
中执行A a; int y = a.x; y++;
,那么我们得到的是y=2
,而a.x=1
。所以give()
没有通过引用返回成员变量x
。我错过了什么? - Mavericky
是 int
而不是 int&
,这意味着它是一个存储自己值的变量。因此,它最初包含你分配给它的值的副本,而不是对原始值的引用。然后,你修改了这个副本,这并不会影响原始值。另外,你的示例似乎根本没有调用 give()
。 - AgentlienA a; int y = a.give(); y++;
!感谢您的澄清。我看到我们还可以调用 int& y = a.x; y++;
,这将给出 y=a.x=2
,而如果 give()
返回的是 int
而不是 int&
,则无法编译。现在都明白了 :) - Maverick