我在这样的课程中遇到问题:
class Sprite {
...
bool checkCollision(Sprite &spr);
...
};
所以,如果我有这门课,我可以这样做:
ball.checkCollision(bar1);
但如果我将课程更改为:
class Sprite {
...
bool checkCollision(Sprite* spr);
...
};
我必须这样做:
ball.checkCollision(&bar1);
那么,有什么区别呢??这是更好的方法而不是其他方法?
谢谢。
在这两种情况下,您实际上传递的是bar1(并且您没有复制该值),因为指针(Sprite *)和引用(Sprite &)都具有引用语义,在第一种情况下显式(您必须显式取消引用指针来操作指向的对象,并且您有显式地将对象的地址传递给指针参数),在第二种情况下是隐式的(当您操作引用时,它是as if您正在操作对象本身,因此它们具有值语法,并且调用者的代码不会使用 & 运算符显式传递指针)。
因此,指针和引用之间的最大区别在于您可以对指针/引用变量执行什么操作:指针变量本身可以修改,因此它们可以更改为指向其他内容,可以为 NULL、递增、递减等,因此,指针上的活动(您可以直接使用变量名访问)和它指向的对象上的活动(您可以使用 * 运算符访问 - 或者,如果您想访问成员,可以使用-> 快捷方式)。
相反,引用的目的只是成为它们指向的对象的别名,并且不允许更改引用本身:您使用它们引用的对象初始化它们,然后它们的行为就好像它们是整个对象一样生活。
一般来说,在 C++ 中,引用优于指针,出于我所说的动机以及您可以在适当的部分C++ 常见问题解答。
就性能而言,它们应该是相同的,因为引用实际上是变相的指针;尽管如此,可能存在一些极端情况,当代码使用引用而不是指针时,编译器可能会进行更多优化,因为保证引用不会更改它们隐藏的地址(即,从它们生命周期的开始到结束)总是指向同一个对象),所以在一些奇怪的情况下你may使用引用可以提高性能,但是,再次强调,使用引用的重点在于良好的编程风格和可读性,而不是性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)