上一次的csdn搞丢了,只能重新再来一遍了。
这次从我学习的课程开始C++,记录每个学习的时刻,希望csdn可以成为我学习的利器。
我们在使用数组的时候常常会遇到数组越界的现象,由于检测需要时间(具体有待学习,大概在编译原理中学习到),所以c++的编译器并没有给出检测,这就需要我们自己写了。
例:
#include <iostream>
using namespace std;
int main()
{
int a[10];
int i;
for(i=0;i<10;i++)
a[i] = 2*i;
for(i=0;i<11;i++)
cout <<a[i]<<endl;
return 0;
}
实现类的检测:选择重载数组的标志符号[ ],使其具备能够检测到是否越界的功能。
#include <iostream>
using namespace std;
class Array
{
private:
int arr[100];//最大设为了100
int arrsize;
public:
Array(int asize=100):arrsize(asize){}//参数初始化表,arrsize=asize
int& operator[](int ind);//对里面的一个数起作用。返回一个int型,即指出哪一个越界,(输出下标)
};
int& Array::operator[](int ind)
{
static int t;//<u>静态变量t,如果是自动变量,出来函数后没有地址是乱的,所以用静态变量,全局破坏函数的独立性,其实没啥作用就是为了不输出乱码,也可以是int t=1<vetor>中系统是抛出异常,不输出</u>
if (ind<arrsize&&ind>=0)//判断是否越界
return arr[ind];
else
{
cout<<"下标出界:("<<ind<<")";
return t;
}
}
int main()
{
Array a(5);//建立对象a,带参数的构造函数,即数组大小为5个,arrsize为5
int i;
for(i=0;i<5;i++)
a[i] = 2*i;//对[]进行运算符重载,使其具有能够检测是否越界的功能。
for(i=0;i<6;i++)
cout <<a[i]<<endl;
return 0;
}
动态分配数组内存:
不想用带参的,不知道是否有多少,输入进去多少就有多少,输出检查越界的时候,根据输入进去的判断是否越界。
真正的动态分配还是没有弄懂,搞了假象,据说<vetor>中有此神奇算法,有待验证。
#include <iostream>
using namespace std;
class Array
{
private:
int *arr;
int arrsize;
public:
Array(int asize=10):arrsize(asize){arr=new int[asize];}
void D(int i){
arrsize=i;
}
~Array(){delete []arr;}
int& operator[](int ind);
};
int& Array::operator[](int ind)
{
static int t;
if (ind<arrsize&&ind>=0){
return arr[ind];
}
else
{
cout<<"下标出界:("<<ind<<")";
return t;
}
}
int main()
{
Array a;
int i;
for(i=0;i<6;i++){
a[i]=2*i;
}
a.D(i);
for(i=0;i<9;i++)
cout <<a[i]<<endl;
return 0;
}
只是将每次输入的个数传给了arrsize,在判断输出是否越界的时侯起作用,每次根据输入都会改变,而真正开辟的是很多的预留空间,并没有真正实现动态分配。