Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类中函数原型的运算符和*at_C++ - Fatal编程技术网

C++ 类中函数原型的运算符和*at

C++ 类中函数原型的运算符和*at,c++,C++,我对这样的课程有一个问题: class Sprite { ... bool checkCollision(Sprite &spr); ... }; 所以,如果我有这个课程,我可以做到: ball.checkCollision(bar1); 但如果我将类更改为: class Sprite { ... bool checkCollision(Sprite* spr); ... }; 我必须这样做: ball.checkCo

我对这样的课程有一个问题:

class Sprite {
    ...
        bool checkCollision(Sprite &spr);
    ...
};
所以,如果我有这个课程,我可以做到:

ball.checkCollision(bar1);
但如果我将类更改为:

class Sprite {
    ...
        bool checkCollision(Sprite* spr);
    ...
};
我必须这样做:

ball.checkCollision(&bar1);
那么,有什么区别??这是一个更好的方式,而不是其他


谢谢。

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


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

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


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

它们都执行基本相同的操作—它们通过引用将对象传递给函数,以便只复制对象的地址。这是有效的,意味着函数可以更改对象

在你给出的简单例子中,它们是等价的

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


有些人也不喜欢按引用传递版本,因为在调用代码中,您传递的对象可能会被修改这一点并不明显。一些编码标准建议您只向函数传递常量引用。

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

在你给出的简单例子中,它们是等价的

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


有些人也不喜欢按引用传递版本,因为在调用代码中,您传递的对象可能会被修改这一点并不明显。一些编码标准建议您只向函数传递常量引用。

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

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

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

指针和引用之间的最大区别在于指针/引用变量可以做什么:指针变量本身可以修改,因此可以更改为指向其他变量,可以为null、递增、递减,等等,因此,使用变量名直接访问的指针上的活动与使用*运算符访问的指针指向的对象上的活动之间存在着很强的分离,或者,如果要访问成员,可以使用->快捷方式

相反,引用的目的只是作为它们指向的对象的别名,并且不允许对引用本身进行更改:您使用它们引用的对象初始化它们,然后它们的行为就好像它们一生都是这样的对象一样

一般来说,C++引用比指针更为可取,因为我所说的动机和其他一些在C++ FAQ中可以找到的动机。
就性能而言,它们应该是相同的,因为引用实际上是伪装的指针;尽管如此,在某些情况下,当代码使用引用而不是指针时,编译器可能会进行更多优化,因为引用保证不会更改它们隐藏的地址,即从其生命周期的开始到结束,它们始终指向同一个对象,因此,在某些奇怪的情况下,使用引用可能会在性能方面有所收获,但是,再次强调,使用引用的意义在于良好的编程风格和可读性,而不是性能。

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

指针和引用之间的最大区别在于指针/引用变量可以做什么:指针变量本身可以修改,因此可以更改为指向其他变量,可以为null、递增、递减,等等,因此,使用变量名直接访问的指针上的活动与使用*运算符访问的指针指向的对象上的活动之间存在着很强的分离,或者,如果要访问成员,可以使用->快捷方式

相反,引用的目的只是作为它们指向的对象的别名,并且不允许对引用本身进行更改:您使用它们引用的对象初始化它们,然后它们的行为就好像它们一生都是这样的对象一样

一般来说,C++引用比指针更为可取,因为我所说的动机和其他一些在C++ FAQ中可以找到的动机。

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

请参阅稍早发布的内容。请参阅稍早发布的内容。哦,好的,但除此之外,一种方法比另一种更快或更有效?如果你传递一个指针,你想写健壮的代码,那么你必须检查它是否为空。如果您使用了引用,则无需进行检查。@Puyover:速度应该是您最后关心的问题。学习这门语言要重要得多。哦,好吧,但除此之外,一种方法比另一种方法更快或更有效?如果你传递了一个指针,你想写健壮的代码,那么你必须检查它是否为空。如果您使用了引用,则无需进行检查。@Puyover:速度应该是您最后关心的问题。学习语言更为重要。引用和指针的语义不同。考虑分配,例如,谢谢,所以我将使用SpRITE *SPR;因为我看得更清楚。@Puyover我认为没有人建议你这么做-你通常应该更喜欢推荐人。@Puyover:呃。。。我回答的重点是建议使用参考文献而不是指针。。。哦,好的。对不起,我不太懂英语,所以我理解了相反的xD再次感谢!引用和指针的语义不同。考虑分配,例如,谢谢,所以我将使用SpRITE *SPR;因为我看得更清楚。@Puyover我认为没有人建议你这么做-你通常应该更喜欢推荐人。@Puyover:呃。。。我回答的重点是建议使用参考文献而不是指针。。。哦,好的。对不起,我不太懂英语,所以我理解了相反的xD再次感谢!C++中有些地方不是味觉,只是参考。例如,作为复制构造函数的参数。C++中有一些地方,这不是味觉的问题,只是引用会做。例如,作为复制构造函数的参数。