C++返回的类变量为什么不能用?

来源:百度知道 编辑:UC知道 时间:2024/05/29 20:54:22
class CVec
{
public:
int GetDim()const;
void operator =(const CVec &a);
double GetData(int k)const;
CVec operator +(const CVec& a) const;
CVec(int n, double r, ...);
CVec(int n);
virtual ~CVec();
private:
double *data;
int dim;
};

CVec::CVec(int n)
{
dim = n;
data = new double[dim];
}

CVec::~CVec()
{
delete []data;
}

CVec::CVec(int n, double r, ...)
{
va_list ap;
va_start(ap, n);
dim = n;
data = new double[dim];
int i;
for ( i = 0; i < dim; i++)
{
data[i] = va_arg(ap, double);
}
va_end(ap);
}

CVec CVec::operator +(const CVec& a) const
{
CVec temp(dim);
for (int i = 0; i < a.dim; i++)
{
temp.data[i] = data[i] + a.GetData(i);
}
return temp;
}

double CVec::GetData(int k) const
{
return dat

该程序的错误发生在“+”操作符函数中
1、局部变量(除了char、int、short等基本类型)不能够作为返回值的,因为局部变量的有效作用域是在函数内部,返回后该局部变量就被析构了,所以返回值无效,导致该返回值无效,对于“+”操作符可以使用局部静态变量来做返回值;
2、“+”操作符返回值应该以引用的形式返回,否则会产生临时对象,而产生临时对象使用默认构造函数(没有给该临时对象的data成员分配内存),但是该临时对象析构时却要delete data成员会出现错误;

具体修改“+”操作符实现如下:
CVec& CVec::operator +(const CVec& a) const
{
static CVec temp(dim);
temp = a;
for (int i = 0; i < a.dim; i++)
{
temp.data[i] = data[i] + a.GetData(i);
}
return temp;
}
return temp ;
}