我想知道如何使用&来访问某个内存位置,从而改变了函数调用的性质。例如,如果我编写了设置圆弧半径的函数

//True, if success, False if radius is off-screen
bool SetRadiusCircle(Circle &b, int r)

这是我教授给我的作业中给出的一个例子。我只是想知道他包含在示例函数调用中的“&”与仅使用Circle b有何不同。

最佳答案

是。如果使用&,则将圆作为引用传递。如果您不使用它,那么您将传递一个circle对象的副本,该副本是由编译器为您创建的。这将触发类复制构造函数(您定义的构造函数或默认的按位复制)。

作为引用,您没有复制对象。相反,您获取的是调用者中拥有的对象。这等效于为原始对象添加别名,并且您执行的任何更改都将应用于传递的对象。如果是副本,则对象的任何更改都会在调用结束时丢失,因为副本已销毁。

使用引用时,该参数的内部使用要求您使用.访问该对象的成员(例如b.getRadius())。如果您将函数定义为代替接受指针(func (Circle *bPtr)),则必须使用->(例如bPtr->getRadius())。使用指针与使用引用不同,但是最终的实际效果是相同的:您可以操纵原始对象,而不是副本。

请注意,这在函数定义中有效。在另一个上下文中使用&可以为您提供指针。尽管它们使用相同的符号,但它们并不相同。

07-24 09:52
查看更多