我有以下简单的 vector 类,我可以在其中定义不同大小的 vector 并对它们求和;我重载了 + 运算符并包含了一个简单的数据显示方法 desplegar();该类定义为:
class Cvector{
private:
int dim;
float * C;
public:
Cvector(){};
Cvector(int n){dim=n; C = new float[dim];};
~Cvector(){delete [] C;};
int getdim(){return dim;};
float getC(int i){
if(i<dim && i>=0)
return C[i];
else
return 0;
};
void setC(int i, float x){
if(i<dim && i>=0)
C[i]=x;
}
void desplegar(){
cout<<"[ ";
for(int i=0;i<dim;i++)
cout<<getC(i)<<" ";
cout<<" ]"<<endl;
}
Cvector operator + (Cvector);
};
Cvector Cvector::operator + (Cvector A){
int n;
if(A.getdim()>dim)
n=A.getdim();
else
n=dim;
Cvector temp(n);
for(int i=0;i<n;i++)
temp.setC(i,getC(i)+A.getC(i));
return temp;
}
当我运行以下代码时,一切正常:
Cvector X(2);
Cvector Y(3);
定义2维和3维的对象
X.setC(0,1);
X.setC(1,4);
Y.setC(0,0);
Y.setC(1,6);
Y.setC(2,9);
将相应的值添加到每个维度(X 为 2,Y 为 3)
X.desplegar();
Y.desplegar();
Cvector T=Y+X;
T.desplegar();
到这里为止一切都正确显示,T 显示 vector Y 和 vector X 的总和,这正是我想要的。但是当我运行时
X.desplegar();
它只显示内存中不相关的数据,似乎对象 X 在作为参数传递给 operator + 时被修改了,为什么会这样?如果我改为使用指向对象的指针,则不会发生这种情况,但发生这种情况似乎并不直观。
有人可以评论吗?
最佳答案
当您使用按值传递参数重载operator +
时,将调用复制构造函数来实例化一个临时对象。默认情况下,复制构造函数是原始对象的按位拷贝。就在方法返回之前,用户定义的析构函数在临时对象上被调用,其中底层存储被释放。
要更正代码,请自行定义复制构造函数或通过引用传递参数。
请永远记住rule-of-three ,也就是说,当你定义了析构函数、复制构造函数和赋值运算符中的任何一个时,请考虑同时定义这三者中的其他。
关于c++ - 在 C++ 中将对象作为参数传递给函数时修改的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20211297/