通过引用传递类不会更改原始类
Passing class by reference doesn't change original
我有一个处理渲染精灵的类,它有一个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
不是引用。mBall
是ball
所指的球的副本。与您的代码类似的示例是
void foo_copy_from_ref(int& x) {
int mx = x;
mx = 42;
}
修改副本对原始副本没有影响,无论您是否从参考文献制作副本。
可以将对Ball
的引用作为成员,但必须在构造函数中对其进行初始化,并且以后不能使其引用其他Ball
。
相关文章:
- 通过引用传递类不会更改原始类
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 当原始指针和唯一指针都引用同一对象时,如何避免双重释放
- 通过引用传递向量的值在传递的原始向量中不会改变
- 为什么更改指针的引用不会更改其原始值?
- C++修改通过引用传递的类不会更改原始对象
- C++ Arduino:向下转换后,子字段不引用原始地址
- 返回引用到原始参数
- 从取消引用的指针返回原始指针
- 从std::array获取对原始数组的引用
- 将新对象shared_pt分配给 A[1],则 A[1] 中包含的原始对象的引用计数减少.如何
- 有没有更好的方法来删除对存储在 vector 中的元素的原始指针引用
- 为什么在按值传递指针之后再按引用传递指针会指向原始内存位置
- 从原始指针/引用创建智能指针
- 删除对变量的引用而不影响原始引用