簡體   English   中英

C ++類:通過引用傳遞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM