[英]C++ Class : Pass by reference
我想知道我在這里做錯了什么。 我正在創建一個類a和一個類b,設置b等於a,設置a的值,並打印b的值。 但是b的價值並沒有改變。
這是我的代碼:
#include <iostream>
using namespace std;
struct Node
{
int x;
int y;
};
class Ball
{
public:
Ball();
Ball(int r, int x, int y);
int GetR();
void SetR(int);
int GetX();
void SetX(int);
int GetY();
void SetY(int);
private:
int m_r;
int m_x;
int m_y;
};
int main(int argc, char* argv[])
{
Ball a;
Ball b;
b = a;
a.SetR(10);
cout << "a.GetR() : " << a.GetR() << endl;
cout << "b.GetR() : " << b.GetR() << endl;
return 0;
}
Ball::Ball()
{
m_r = 0;
m_x = 0;
m_y = 0;
}
Ball::Ball(int r, int x, int y)
{
m_r = r;
m_x = x;
m_y = y;
}
int Ball::GetR()
{
return m_r;
}
void Ball::SetR(int r)
{
m_r = r;
}
int Ball::GetX()
{
return m_x;
}
void Ball::SetX(int x)
{
m_x = x;
}
int Ball::GetY()
{
return m_y;
}
void Ball::SetY(int y)
{
m_y = y;
}
這是我的終端輸出:
a.GetR() : 10
b.GetR() : 0
任何人都可以向我解釋一下C ++中類的傳遞方式以及為什么會發生這種情況?
先感謝您。
不,你在哪里“通過引用傳遞”。 代碼按預期工作。 您創建對象a
和新對象b
。 然后你改變對象a
r
。 因為b
是一個完整的單獨對象(未連接到a
),所以r
不會改變。 看起來您正在嘗試創建對象a
的引用 ,您可以在其中執行此操作:
Ball &b = a;
現在代碼將打印: b.GetR() : 10
通過分配Ball b = a;
,它的作用只是創建對象的淺表副本。 所以a和b有不同的分配內存。 a(按值)對屬性的任何更改都不會對b產生影響。
答案是您需要使用引用分配:
Ball &b = a;
只是一些額外的信息,我想更多地解釋一下我在上面強調的“淺薄”字:
class X {
int r;
}
class A {
X *myX;
}
class B {
X *myB;
}
如果我設置A a; B b =a;
A a; B b =a;
那么a.myX.r = 10;
也會影響b.myX.r
這是因為對象復制很淺。 它不會復制指向的指針,而只復制指針本身。
通過將b
分配給a
,您將調用Ball
類的隱式復制構造函數:
Ball a;
Ball b;
b = a;
這使得b
副本a
。 如果你想b
到參考a
,你應該改變類型Ball&
,就像這樣:
Ball a;
Ball& b = a;
球a; 球b;
b = a; //對象b的數據成員將具有對象a的數據成員的副本。 來自兩個對象的數據成員確實連接在一起(或鏈接或無論如何)。 他們獨立擁有自己的價值觀。 更改一個對象的數據成員的值時,更改不會影響另一個對象的數據成員。
a.SetR(10); //這會更改對象a的數據成員,而不是b。 這就是你有這個結果的原因。
如果您希望對象內的更改影響另一個,則需要設置:Ball&b = a;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.