我遇到类似这样的课的问题:
class Sprite {
...
bool checkCollision(Sprite &spr);
...
};
所以,如果我有这门课,我可以这样做:
ball.checkCollision(bar1);
但如果我将课程更改为:
class Sprite {
...
bool checkCollision(Sprite* spr);
...
};
我必须这样做:
ball.checkCollision(&bar1);
那么,有什么区别?这是另一种方式更好吗?
谢谢。
答案 0 :(得分:4)
在这两种情况下,您实际上都是传递 bar1 的地址(并且您没有复制该值),因为指针(Sprite *)和引用(Sprite&)都有引用语义,在第一种情况下显式(您必须显式取消引用指针来操纵指向对象,并且您必须显式地将对象的地址传递给指针参数),在第二种情况下隐式(当您操作引用时它是好像你正在操纵对象本身,因此它们具有值语法,并且调用者的代码没有使用&运算符显式传递指针。
因此,指针和引用之间的最大区别在于您可以对指针/引用变量执行的操作:可以修改指针变量本身,因此可以将它们更改为指向其他内容,可以为NULL,递增,递减等等,因此指针上的活动(您可以直接使用变量名称访问)和它指向的对象(您使用*运算符访问的对象)之间存在强烈的分离 - 或者,如果您想要访问成员,使用 - >快捷方式)。
相反,引用的目的是成为它们指向的对象的别名,并且不允许更改引用本身:使用它们引用的对象初始化它们,然后它们就像它们就是这样的对象一样他们的一生。一般来说,在C ++中,引用优先于指针,我所说的动机和其他一些你可以在appropriate section的C ++ FAQ中找到的动机。
就性能而言,它们应该是相同的,因为引用实际上是伪装的指针;仍然,可能存在一些极端情况,当代码使用引用而不是指针时,编译器可以优化更多,因为保证引用不会改变它们隐藏的地址(即,从生命的开始到结束它们总是指向同一个对象),所以在某些奇怪的情况下,可能使用引用获得性能,但同样,使用引用的关键在于良好的编程风格和可读性,而不是性能。 / p>
答案 1 :(得分:1)
引用不能为null。指针可以。
如果您不想允许将空指针传递到您的函数中,请使用引用。
答案 2 :(得分:0)
它们都执行(基本上)相同的操作 - 它们通过引用将对象传递给函数,以便仅复制对象的地址。这是有效的,意味着该功能可以改变对象。
在简单的情况下,你给他们相同。
主要区别在于引用不能为null,因此您不必在函数中测试null - 但如果没有对象的情况有效,则也无法传递null对象。
有些人也不喜欢引用版本的传递,因为在调用代码中并不明显可能会修改传入的对象。一些编码标准建议您只将const引用传递给函数。
答案 3 :(得分:0)
使用指针你需要特别让编译器知道你想要传递对象的地址,并带有引用,编译器已经知道你想要ptr。两者都没问题,这是一个品味问题,我个人不喜欢参考,因为我喜欢看到什么,但那只是我。