迷失在通过引用、通过值传递的参数中
Get lost in parameter passing by reference, by value
我正在尝试制作一个袋子容器。当我重载=
运算符时,会出现超出我能力范围的问题。
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++为您做这项工作。
相关文章:
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 通过常量引用传递参数的矩阵模板类
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 具有常量引用参数的函数模板专用化
- 作为参数引用
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何传递带有通过引用传递的结构参数的函数?
- 将输入参数作为右值引用传递?
- 使用引用与指针将数组作为参数传递
- 根据模板参数引用不同基类的函数
- 默认情况下C++数组作为参数引用
- 对指针C++的参数引用
- 作为非类型模板参数引用
- 重用返回语句或按参数引用返回
- 将参数引用传递给函数C++
- 从另一个参数引用的模板可变参数
- 成员变量多态性和参数引用
- 按参数引用或按参数引用之间的差异
- 无法实例化抽象类:为什么模板参数(引用)导致这种情况