C++对象数组创建与释放问题,new与delete
{
private:
float* p_val;
int size;
public:
CVector(float *,int s);
CVector(const CVector &v);
~CVector();
void display(){
for(i=0;i<size;i++)
cout<<p_val[i]<<" ";
cout<<endl;}
};
CVector::CVector(float *p,int s)
{
size=s;
p_val=new float[size];
for(i;i<size;i++)
p_val[i]=p[i];
}
CVector::CVector(const CVector &v)
{
size=v.size;
p_val=new float[v.size];
for(i=0;i<size;i++)
p_val[i]=v.p_val[i];
}
CVector:: ~CVector()
{
delete []p_val;
}
int main()
{
float a[5]={1,2,3,4,5},b[5]={6,7,8,9,10};
CVector c1(a,5),c2(c1);
CVector c3(b,5);
cout<<"对象c1: ";
c1.display();
cout<<"对象c2:";
c2.display();
cout<<"对象c3: ";
c3.display(); // 这里为什么输出的数据是乱码?
return 0;
}
还有,为什么声明时CVector& operator = (const CVector &v); //赋值运算符重载
float& operator[] (int ix); //下标运算符重载
关键字operator前面要加&,是什么意思?
在类外定义时CVector & CVector::operator =(const CVector &v)
float & CVector:: operator [] (int ix)
& 又提到前面?
在重载 其它运算符如 +、++、-时,为什么没有用 &? 展开
2013-06-14
你这个是你的源代码么?类名不对,i 也没定义。改了之后倒是能正确输出。
class CVector
{
private:
float* p_val;
int size;
public:
CVector(float *,int s);
CVector(const CVector &v);
~CVector();
void display(){
for(int i=0;i<size;i++)
cout<<p_val[i]<<" ";
cout<<endl;}
};
CVector::CVector(float *p,int s)
{
size=s;
p_val=new float[size];
for(int i=0;i<size;i++)
p_val[i]=p[i];
}
CVector::CVector(const CVector &v)
{
size=v.size;
p_val=new float[v.size];
for(int i=0;i<size;i++)
p_val[i]=v.p_val[i];
}
CVector:: ~CVector()
{
delete []p_val;
}
int main()
{
float a[5]={1,2,3,4,5},b[5]={6,7,8,9,10};
CVector c1(a,5),c2(c1);
CVector c3(b,5);
cout<<"对象c1: ";
c1.display();
cout<<"对象c2:";
c2.display();
cout<<"对象c3: ";
c3.display(); // 这里为什么输出的数据是乱码?
system("pause");
return 0;
}
#include<iostream>
using namespace std;
class CVector
{
private:
float* p_val;
int size;
public:
CVector(float *,int s);
CVector(const CVector &v);
~CVector();
void display(){
for(int i = 0;i < size;i++)
cout<<p_val[i]<<" ";
cout<<endl;}
};
CVector::CVector(float *p,int s)
{
size = s;
p_val=new float[size];
for(int i = 0;i < size;i++)
p_val[i] = p[i];
}
CVector::CVector(const CVector &v)
{
size=v.size;
p_val=new float[v.size];
for(int i = 0; i < size; i++)
p_val[i] = v.p_val[i];
}
CVector:: ~CVector()
{
delete []p_val;
}
int main()
{
float a[5]={1,2,3,4,5},b[5]={6,7,8,9,10};
CVector c1(a,5),c2(c1);
CVector c3(b,5);
cout<<"对象c1: ";
c1.display();
cout<<"对象c2:";
c2.display();
cout<<"对象c3: ";
c3.display(); // 这里为什么输出的数据是乱码?
return 0;
}
程序没有问题,主要是i没有初始化,改完后在我这运行正常。
对象c1: 1 2 3 4 5
对象c2:1 2 3 4 5
对象c3: 6 7 8 9 10
{
size=s;
p_val=new float[size];
for(i;i<size;i++)
p_val[i]=p[i];
}
你自己看下你的i没有初始化。
最奇怪的是,你的i明明没有定义,为什么你的程序能运行?
函数的返回类型后面加个&,是表示返回一个引用类型。
作用可以看下这个
http://baike.baidu.com/view/8360670.htm
没看到你的i变量定义在哪里
改了一下
运行结果是正确的
#include <iostream>
using namespace std;
class CVector
{
private:
float* p_val;
int size;
public:
CVector(float *,int s);
CVector(const CVector &v);
~CVector();
void display()
{
int i;
for(i=0;i<size;i++)
cout<<p_val[i]<<" ";
cout<<endl;
}
};
CVector::CVector(float *p,int s)
{
int i=0;
size=s;
p_val=new float[size];
for(i;i<size;i++)
p_val[i]=p[i];
}
CVector::CVector(const CVector &v)
{
int i;
size=v.size;
p_val=new float[v.size];
for(i=0;i<size;i++)
p_val[i]=v.p_val[i];
}
CVector:: ~CVector()
{
delete []p_val;
}
int main()
{
float a[5]={1,2,3,4,5},b[5]={6,7,8,9,10};
CVector c1(a,5),c2(c1);
CVector c3(b,5);
cout<<"对象c1: ";
c1.display();
cout<<"对象c2:";
c2.display();
cout<<"对象c3: ";
c3.display(); // 这里为什么输出的数据是乱码?
return 0;
}
type & func_name(va_list)
的形势,&修饰的是前面的type 表示其返回值为引用类型。 所以&紧跟前面的类型
用引用做返回值可以减少中间临时变量的生成,从而增加效率
是否使用引用返回值,在重载运算符时没有强制的要求,全凭自愿
但是如果用一些STL 模板, 模板会对重载类型有要求,如果不一致会报错。其他的倒是没什么大的影响