总结:
1、此代码主要用途是创建可存放数据的容器
2、此代码存放数据主要运用运算符重载的原理(对[ ]的的重载),以及返回引用使其可存数据
3、通过对<<的重载,使其能输出对象,通过返回引用,使其可以连续输出对象
返回值与返回引用区别:
1、返回值为引用型( & )的时候,返回的是地址,即返回它本身。
2、返回值不是引用型的时候,返回的是一个数值,而且是一个临时数值,函数运行完就不存在了。
#include <iostream>
using namespace std;
class Array
{
friend std::ostream& operator<<(std::ostream& o,const Array &a);
//friend void operator<<(std::ostream& o,const Array &a);
const int size;
double* pdata;
public:
Array(int s):size(s)
{
pdata = new double[s];
}//构造函数
Array(const Array&b):size(b.size)
{
pdata = new double[size];
for(int i=0; i<size; i++)
{
pdata[i] = b.pdata[i];
}
}//复制函数
~Array()
{
delete[]pdata;
}//析构函数
int getsize()
{
return size;
}
/*void setdata(int i,double v)
{
pdata[i] = v;
}存数据可用double& operator[](int i)const替代*/
/*double getdata(int i)
{
return pdata[i];
}取数据可用double operator[](int i)const或者double& operator[](int i)const替代*/
/*double operator[](int i)const
{
return pdata[i];
}[]的重载使其有取数据功能,与double& operator[](int i)const函数的区别在于返回值和返回引用的区别*/
double& operator[](int i)const
{
return pdata[i];
}//可以存取数据,运用返回引用的知识
};
/*void operator<<(std::ostream& o,const Array &a)
{
for(int i=0;i<a.getsize();i++)
{
o<<a[i]<<' ';
}
o<<endl;
}对<<进行重载,使其可以输出对象,但一次只能输出一个对象,即不能cout<<a1<<a2;*/
std::ostream& operator<<(std::ostream& o,const Array &a)
{
for(int i=0; i<a.size; i++)
{
o<<a[i]<<' ';
}
o<<std::endl;
return o;
}//对<<进行重载,使其可以输出对象,因是返回引用会返回o本身,故可以连续输出对象,即cout<<a1<<a2是正确的
int main()
{
Array a1(10);
Array a2(10);
for(int i=0; i<a1.getsize(); i++)
{
//a1.setdata(i,i+1.5);
a1[i]=i+1.5;
}
for(int i=0; i<a2.getsize(); i++)
{
//a1.setdata(i,i+1.5);
a2[i]=i+2.5;
}
//cout<<a1.getdata(0);
std::cout<<a1[5]<<std::endl;
std::cout<<a1;
std::cout<<a1<<a2;
return 0;
}