运营商&和*在课堂上的函数原型

时间:2010-06-17 21:37:03

标签: c++

我遇到类似这样的课的问题:

class Sprite {
    ...
        bool checkCollision(Sprite &spr);
    ...
};

所以,如果我有这门课,我可以这样做:

ball.checkCollision(bar1);

但如果我将课程更改为:

class Sprite {
    ...
        bool checkCollision(Sprite* spr);
    ...
};

我必须这样做:

ball.checkCollision(&bar1);

那么,有什么区别?这是另一种方式更好吗?

谢谢。

4 个答案:

答案 0 :(得分:4)

在这两种情况下,您实际上都是传递 bar1 的地址(并且您没有复制该值),因为指针(Sprite *)和引用(Sprite&)都有引用语义,在第一种情况下显式(您必须显式取消引用指针来操纵指向对象,并且您必须显式地将对象的地址传递给指针参数),在第二种情况下隐式(当您操作引用时它是好像你正在操纵对象本身,因此它们具有值语法,并且调用者的代码没有使用&运算符显式传递指针。

因此,指针和引用之间的最大区别在于您可以对指针/引用变量执行的操作:可以修改指针变量本身,因此可以将它们更改为指向其他内容,可以为NULL,递增,递减等等,因此指针上的活动(您可以直接使用变量名称访问)和它指向的对象(您使用*运算符访问的对象)之间存在强烈的分离 - 或者,如果您想要访问成员,使用 - >快捷方式)。

相反,引用的目的是成为它们指向的对象的别名,并且不允许更改引用本身:使用它们引用的对象初始化它们,然后它们就像它们就是这样的对象一样他们的一生。

一般来说,在C ++中,引用优先于指针,我所说的动机和其他一些你可以在appropriate section的C ++ FAQ中找到的动机。

就性能而言,它们应该是相同的,因为引用实际上是伪装的指针;仍然,可能存在一些极端情况,当代码使用引用而不是指针时,编译器可以优化更多,因为保证引用不会改变它们隐藏的地址(即,从生命的开始到结束它们总是指向同一个对象),所以在某些奇怪的情况下,可能使用引用获得性能,但同样,使用引用的关键在于良好的编程风格和可读性,而不是性能。 / p>

答案 1 :(得分:1)

引用不能为null。指针可以。

如果您不想允许将空指针传递到您的函数中,请使用引用。

答案 2 :(得分:0)

它们都执行(基本上)相同的操作 - 它们通过引用将对象传递给函数,以便仅复制对象的地址。这是有效的,意味着该功能可以改变对象。

在简单的情况下,你给他们相同。

主要区别在于引用不能为null,因此您不必在函数中测试null - 但如果没有对象的情况有效,则也无法传递null对象。

有些人也不喜欢引用版本的传递,因为在调用代码中并不明显可能会修改传入的对象。一些编码标准建议您只将const引用传递给函数。

答案 3 :(得分:0)

使用指针你需要特别让编译器知道你想要传递对象的地址,并带有引用,编译器已经知道你想要ptr。两者都没问题,这是一个品味问题,我个人不喜欢参考,因为我喜欢看到什么,但那只是我。