迷失在通过引用、通过值传递的参数中

Get lost in parameter passing by reference, by value

本文关键字:参数 引用 迷失 值传      更新时间:2023-10-16

我正在尝试制作一个袋子容器。当我重载=运算符时,会出现超出我能力范围的问题。

Zsak& Zsak::operator =(const Zsak& a)
{
  (*this).V=a.V;
  (*this).elemsz=a.elemsz;
  return *this;
}

带有此标题:

class Zsak
{
public:
    Zsak (){V=new Elem[100];}
    Zsak (const Zsak & a)
    {
        *this=a;
    }
    Zsak(int meret)
    {
        V=new Elem[meret];
    }
    ~Zsak(){delete[] V;}
    Zsak& operator -(const Zsak& b);
    Zsak& operator =(const Zsak& a);
    void Zsak_Ba(int e);
    void Zsak_Bol(int e);
    bool Uress();
    int E_Hany(int e) const;
    friend std::ostream& operator << (std::ostream& out,const Zsak& z);
private:
    Elem  *V;
    int elemsz=0;
};

Zsak_Ba将一个元素放入包中;

Zsak_Bol从包中抽出一个元素;

我通过测试观察到const Zsak a的地址与*this的地址一致。

在这种情况下

Zsak z(5),c(5);
z.Zsak_Ba(1);
z.Zsak_Ba(1);
z.Zsak_Ba(1);
z.Zsak_Ba(2);
z.Zsak_Ba(2);
z.Zsak_Ba(2);
z.Zsak_Ba(4);
Zsak d=z;
d.Zsak_Bol(1);
cout<<z<<endl<<d; 

它打印:

1 2
2 3
4 1
1 2
2 3
4 1

它真正应该打印的是:

1 3
2 3
4 1
1 2
2 3
4 1

我应该怎么做才能得到这个?我做错了什么?为什么?

非常感谢!

您只能复制赋值运算符中的指针(而不是内容)。

Zsak& Zsak::operator =(const Zsak& a)
{
  if (this == &a) { // or std::addressof(a)
    return *this;
  }
  delete[] V;
  elemsz=a.elemsz;
  V=new Elem[elemsz];
  for (std::size_t i = 0; i < elemsz; ++i) {
    V[i] = a.V[i];
  }
  return *this;
}

此外,我看不出elemsz在哪里更新(在成员初始化之外)。我想它会出现在构造函数中。

Zsak(int meret)
{
    V=new Elem[meret];
    elemsz = meret;
}

Zsak ()
{
  V=new Elem[100];
  elemsz = 100;
}

还可能值得注意的是,通常使用"副本交换"来实现赋值运算符,并在副本构造函数中实现完整副本(基本上与现有副本相反)。

"副本交换"看起来像

Zsak (const Zsak & a) : elemsz(a.elemsz)
{
  V = new Elem[elemsz];
  for (int i = 0; i < elemsz; ++i) { // copy the contents
    V[i] = a.V[i];
  }
}
Zsak& Zsak::operator =(const Zsak& a)
{
  Zsak temp(a);
  std::swap(this->elemsz, temp.elemsz);
  std::swap(this->V, temp.V);
  return *this;
}

向self分配时会产生一些开销,如果需要,可以为此添加一个self分配测试。

理解这是一项使用和实现动态内存的任务,最好在主类之外重新考虑Elem阵列及其管理。通常情况下,维护和更正出现的错误和问题更容易。

如果使用vector<Elem>而不是手动动态内存,则不需要任何用户定义的复制构造函数或赋值运算符。它会起作用的。这是首选的解决方案。让C++为您做这项工作。