c++ - 在 C++ 中将对象作为参数传递给函数时修改的对象

标签 c++ object pointers vector arguments

我有以下简单的 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/

相关文章:

c# - 如何将字符串发送到 com 接口(interface)中的方法?

c++ - boost的多索引是否复制键对象

c++ - 在 MinGW g++ 编译器中获取 "tlhelp32.h"的编译错误

C++ 对象引用而不是复制

c - a[n] 真的可以与 *(a+n) 互换吗 - 为什么 sizeof 返回两个不同的答案?

c++ - 带有 Eigen 的函数指针

c++ - 通过派生类模板参数指定基类模板参数之一。如何使用基类的 using 声明

javascript - 我们如何减少嵌套数组?

javascript - 当 javascript 函数用作对象的基础时的变量 -

c - char string[100] 和 char *string = malloc(100) 之间的区别