通过引用传递类不会更改原始类

Passing class by reference doesn't change original

本文关键字:原始 引用      更新时间:2023-10-16

我有一个处理渲染精灵的类,它有一个Ball,上面Gun对象,设置它们的精灵,并在每一帧渲染它们。我想将该球对象传递给枪,以便在用户按下空格键时枪可以开火(输入在枪上处理(。我尝试了指针,现在通过引用传递,但是当我在传入后更改它不会影响原始指针。在我的主课上,我称之为gun.init(&ball(,我将在这里展示。Gun有一个可变Ball mBall

class Gun : public GameObj
{
public:
Gun()
:GameObj(), mWaitSecs(0)
{}
void Update();      
void Init(Ball &ball);      //init function that passes in ball?
private:
float mWaitSecs;    //delay after firing beforeo you can move/fire
Ball mBall;
};
void Gun::Init(Ball &ball) {  
mBall = ball;
}

[..] 但是当我在传入后更改它时,它不会影响原始内容。

坦率地说,你有一个基本的误解。为了澄清这一点,我必须绕一点路。

按值传递

void foo_value(int x) { x += 42; }

通过以下方式调用此函数

int y = 50;
foo_value(y);

不会更改y的值。

按引用传递

void foo_ref(int& x) { x += 42; }

调用此函数将修改y

int y = 50;
foo_ref(y); 
assert(y == 50+42);

重新绑定引用

不能重新绑定引用。这就是为什么你不能不初始化引用的原因:

int& y;      // error
int x;
int& y = x;  // ok

一旦你有一个参考,你就不能让它引用其他东西。您不能"重新分配"引用:

int x = 0;
int& ref = x;
int y = 42;
ref = y;          // same as x = y; 

在最后一行之后,ref仍然是对x的引用。

您的代码

您确实通过引用传递ball,但您的成员mBall不是引用。mBallball所指的球的副本。与您的代码类似的示例是

void foo_copy_from_ref(int& x) {
int mx = x;
mx = 42;
}

修改副本对原始副本没有影响,无论您是否从参考文献制作副本。

可以将对Ball的引用作为成员,但必须在构造函数中对其进行初始化,并且以后不能使其引用其他Ball