为什么不允许获取非const引用临时对象,函数getx()返回? 显然,这是C ++标准所禁止的,但我对这种限制的目的感兴趣, 而不是对标准的引用 。 struct X { X& ref() { return *this; } }; X getx() { return X();} void g(X & x) {} int f() { const X& x = getx(); // OK X& x = getx(); // error X& x = getx().ref(); // OK g(getx()); //error g(getx().ref()); //OK return 0; } 很显然,对象的生命周期不可能是原因,因为对C […]
我知道引用是语法糖,所以代码更容易读写。 但有什么区别? 下面的答案和链接摘要: 指针可以重新分配任意次数,而绑定后不能重新引用引用。 指针可以指向任何地方( NULL ),而引用总是指向一个对象。 你不能像引用指针那样使用引用的地址。 没有“引用算术”(但是你可以把一个引用指向的对象的地址作为指针并且在&obj + 5做指针运算)。 澄清一个误解: C ++标准非常小心,以避免编译器如何实现引用,但每个C ++编译器都将引用实现为指针。 也就是说,一个声明如: int &ri = i; 如果没有完全优化 ,则分配与指针相同的存储量,并将i的地址放入该存储中。 所以,一个指针和一个引用都占用相同数量的内存。 作为基本规则, 在函数参数和返回types中使用引用来定义有用和自我logging的接口。 使用指针来实现algorithm和数据结构。 有趣的阅读: 我最喜欢的C ++ FAQ lite 。 参考与指针 。 参考文献介绍 。 引用和常量 。
我知道这个标题听起来很熟悉,因为有很多类似的问题,但是我要求问题的另一个方面(我知道堆栈中的东西和将它们放在堆上的区别)。 在Java中,我总是可以返回对“本地”对象的引用 public Thing calculateThing() { Thing thing = new Thing(); // do calculations and modify thing return thing; } 在C ++中,为了做类似的事情,我有两个选项 (1)当我需要“返回”一个对象时,我可以使用引用 void calculateThing(Thing& thing) { // do calculations and modify thing } 然后像这样使用它 Thing thing; calculateThing(thing); (2)或者我可以返回一个指向动态分配的对象的指针 Thing* calculateThing() { Thing* thing(new Thing()); // do calculations and modify thing return thing; } 然后像这样使用它 […]