【问题标题】:Operator & and * at function prototype in class类中函数原型的运算符 & 和 *
【发布时间】:2011-03-05 04:42:51
【问题描述】:

我对这样的课程有疑问:

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

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

ball.checkCollision(bar1);

但是如果我把课程改成这样:

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

我必须这样做:

ball.checkCollision(&bar1);

那么,有什么区别呢??这是一种更好的方式而不是其他方式?

谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

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

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

【讨论】:

  • 哦,好吧,但除此之外,一种方法比另一种方法更快或更有效?
  • 如果你传递一个指针并且你想编写健壮的代码,那么你必须检查它是否为空。如果您使用参考,则无需进行检查。
  • @Puyover:速度应该是您最不关心的问题。学习语言更为重要。
【解决方案2】:

它们都做(本质上)相同的事情——它们通过引用将对象传递给函数,以便只复制对象的地址。这是高效的,意味着函数可以更改对象。

在你给出的简单情况下,它们是等价的。

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

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

【讨论】:

    【解决方案3】:

    使用指针你需要专门让编译器知道你想要传递对象的地址,使用引用,编译器已经知道你想要ptr。两者都可以,这是一个品味问题,我个人不喜欢参考,因为我喜欢看看发生了什么,但那只是我自己。

    【讨论】:

    • 在 C++ 中有些地方不是口味问题 - 只有参考才行。例如,作为复制构造函数的参数。
    【解决方案4】:

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

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

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

    一般来说,在 C++ 中,引用比指针更受欢迎,因为我所说的动机以及其他一些你可以在 C++ 常见问题解答的appropriate section 中找到的动机。

    在性能上应该是一样的,因为引用其实是变相的指针;尽管如此,当代码使用引用而不是指针时,编译器可能会进行更多优化,因为引用保证不会更改它们隐藏的地址(即,从生命的开始到结束,它们总是指向同一个对象),所以在某些奇怪的情况下,您可能使用引用在性能方面有所收获,但同样,使用引用的意义在于良好的编程风格和可读性,而不是性能。

    【讨论】:

    • 引用和指针的语义不同。例如,考虑分配。
    • 谢谢,所以我将使用 Sprite* spr;因为我看得更清楚。
    • @Puyover 我认为没有人建议你应该这样做 - 你通常应该更喜欢参考。
    • @Puyover: 呃...我的回答的重点是建议使用引用而不是指针... <_ href="http://www.parashift.com/c++-faq-lite/references.html#faq-8.6" rel="nofollow" target="_blank">parashift.com/c++-faq-lite/references.html#faq-8.6),“当你可以,必要时指点一下。”
    • 哦,好的。对不起,我英文不太好,所以我理解了相反的xD再次感谢!
    猜你喜欢
    • 2011-09-28
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多