5.21的开始--简单延伸:类设计(重载运算符的应用)-对数组越界的处理

本文详细介绍了如何在C++中实现动态数组及其越界检测功能,包括通过重载[]运算符来判断数组元素访问是否越界,以及如何通过动态内存分配来灵活控制数组大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一次的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;
}

很明显我们可以看到输出时,出现的a[10]越界,输出的第十一个数也是不准确的。

实现类的检测:选择重载数组的标志符号[ ],使其具备能够检测到是否越界的功能。

#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,在判断输出是否越界的时侯起作用,每次根据输入都会改变,而真正开辟的是很多的预留空间,并没有真正实现动态分配。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值