T和T&之间的区别是什么?

3

嗨,我想知道做以下两件事情有什么不同:

template <typename T> class List :
   T& getData();        
AND
   T getData();
};     

你的标题中,是不是应该写成 T& 而不是 &T? - billz
2个回答

11
给定一个类型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。我错过了什么? - Maverick
1
yint 而不是 int&,这意味着它是一个存储自己值的变量。因此,它最初包含你分配给它的值的副本,而不是对原始值的引用。然后,你修改了这个副本,这并不会影响原始值。另外,你的示例似乎根本没有调用 give() - Agentlien
当然,一开始就应该是 A a; int y = a.give(); y++;!感谢您的澄清。我看到我们还可以调用 int& y = a.x; y++;,这将给出 y=a.x=2,而如果 give() 返回的是 int 而不是 int&,则无法编译。现在都明白了 :) - Maverick

2
 T& getData(); returns a reference to T        

 T getData(); returns a copy of T

什么是C++引用: 链接

你所说的“按引用传递”,是指变量Data的地址吗? - Lol Pallau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接