原贴:http://blog.csdn.net/keeplooking2510/article/details/8042057
数组在类的定义中确定好了长度之后,就会限制所要存储的元素的个数,假如我们要存储的元素的个数超过了已确定的数组的长度,那么就会导致数组越界。故最好的办法就是在创建对象的时候才确定要存储元素的个数,即数组的长度,而不是在数组定义的时候。
此时,可采用重载数组下标操作符[]函数来解决,即创建一个char& A::operator[](int i);函数,i为创建对象数组传过来的下标值。具体例子如下:
#include <iostream>
using namespace std;
class A
{
private:
int length;
char* Size; //定义指向char类型数组的的空间的指针
public:
A(int l)
{
length=l;
Size=new char[length];//在堆中开辟新空间,保存char类型数组,长度为length(此长度在创建对象时确定),
//该空间的地址赋给成员指针变量Size
}
~A(){delete [] Size;}
int GetLength(){return length;}
char& operator[](int i);//声明下标操作函数operator[],i为对象数组传过来的下标值
//用 [] 取值,并通过 [] 修改原来的元素,所以要通过引用返回的就是 size[] 本身的一个元素。
};
char& A::operator [](int i)
{
if(i>=0&&i<=length)
return Size[i];
else
{
cout<<"\n超出范围!\n";
return Size[length-1];
}
#include "demoClass_1.h"
using namespace std;
//使用operator[]下标函数的优点:(1)不用将数组的长度定义为一个常量;(2)可避免数组越界。
//注意点:(1)由于下标运算符函数的参数是数组的下标,因此该函数只能带一个参数,不可带多个参数;
//(2)由于下标运算符函数只限于本类的对象使用,因此不得将下标运算符函数重载为友元函数,且必须是非static成员函数。
int main()
{
A a(6);
char* ch="helloEV";
for(int i=0;i<8;i++)
{
a[i]=ch[i];//每循环一次,将ch中的一个字符赋给对象a的char型数组,
//赋值符左边的a[i]==a.operator[](i),即调用重载构造函数,i是下标值。
//如果i不超过堆中创建的char型数组长度,
//那么返回char型数组的第i个元素;如果超过,则返回该数组的最后一个元素。
cout<<"第"<<i+1<<"次循环:"<<a[i]<<endl;
}
cout<<"\n";
for(int j=0;j<8;j++)
cout<<a[j]<<endl;
cout<<"\n";
cout<<a.GetLength()<<endl;
}
数组在类的定义中确定好了长度之后,就会限制所要存储的元素的个数,假如我们要存储的元素的个数超过了已确定的数组的长度,那么就会导致数组越界。故最好的办法就是在创建对象的时候才确定要存储元素的个数,即数组的长度,而不是在数组定义的时候。
此时,可采用重载数组下标操作符[]函数来解决,即创建一个char& A::operator[](int i);函数,i为创建对象数组传过来的下标值。具体例子如下:
#include <iostream>
using namespace std;
class A
{
private:
int length;
char* Size; //定义指向char类型数组的的空间的指针
public:
A(int l)
{
length=l;
Size=new char[length];//在堆中开辟新空间,保存char类型数组,长度为length(此长度在创建对象时确定),
//该空间的地址赋给成员指针变量Size
}
~A(){delete [] Size;}
int GetLength(){return length;}
char& operator[](int i);//声明下标操作函数operator[],i为对象数组传过来的下标值
//用 [] 取值,并通过 [] 修改原来的元素,所以要通过引用返回的就是 size[] 本身的一个元素。
};
char& A::operator [](int i)
{
if(i>=0&&i<=length)
return Size[i];
else
{
cout<<"\n超出范围!\n";
return Size[length-1];
}
}
#include "demoClass_1.h"
using namespace std;
//使用operator[]下标函数的优点:(1)不用将数组的长度定义为一个常量;(2)可避免数组越界。
//注意点:(1)由于下标运算符函数的参数是数组的下标,因此该函数只能带一个参数,不可带多个参数;
//(2)由于下标运算符函数只限于本类的对象使用,因此不得将下标运算符函数重载为友元函数,且必须是非static成员函数。
int main()
{
A a(6);
char* ch="helloEV";
for(int i=0;i<8;i++)
{
a[i]=ch[i];//每循环一次,将ch中的一个字符赋给对象a的char型数组,
//赋值符左边的a[i]==a.operator[](i),即调用重载构造函数,i是下标值。
//如果i不超过堆中创建的char型数组长度,
//那么返回char型数组的第i个元素;如果超过,则返回该数组的最后一个元素。
cout<<"第"<<i+1<<"次循环:"<<a[i]<<endl;
}
cout<<"\n";
for(int j=0;j<8;j++)
cout<<a[j]<<endl;
cout<<"\n";
cout<<a.GetLength()<<endl;
}