c++语言中不会检查数组是否越界。设计类Border,通过重载运算符检查数组是否越界
可以通过自定义类的方式来实现这一功能,例程如下:
class Border {
public:
explicit Border(int size) : size_(size) {}
// 重载 [] 运算符
int& operator[](int i) {
if (i < 0 || i >= size_) {
throw std::out_of_range("Index out of range");
}
return data_[i];
}
private:
int size_;
int data_[1000];
};
定义了一个 Border 类,它包含一个私有成员变量 size_ 表示数组的大小,以及一个私有成员数组 data_ 用于存储数据。重载了 [] 运算符,并在其中添加了对越界访问的检查。
使用时,像使用普通数组一样使用 Border 对象,例如:
Border arr(10);
arr[5] = 10; // 正常访问
arr[15] = 20; // 越界访问,抛出 std::out_of_range 异常
在重载运算符时需要返回引用类型,以便能够修改数组元素的值。同时,为了让 [] 运算符能够与普通数组一样能够使用,将参数设置为整型。
在 C++ 中,确实没有内置的机制来检查数组是否越界。但是,我们可以通过自定义类来实现这个功能。下面是一个简单的 Border 类的实现,它可以通过重载运算符来检查数组是否越界:
class Border {
public:
Border(int size) : size_(size) {}
// 重载 [] 运算符
int& operator[](int index) {
if (index < 0 || index >= size_) {
// 如果越界,抛出异常
throw std::out_of_range("Index out of range");
}
return data_[index];
}
private:
int size_;
int data_[100]; // 假设数组最大长度为 100
};
在上面的代码中,我们定义了一个 Border 类,它包含一个私有的整型数组和一个整型变量 size,表示数组的长度。我们重载了 [] 运算符,当用户使用 [] 访问数组元素时,我们会检查索引是否越界。如果越界,我们会抛出一个 std::out_of_range 异常。
使用 Border 类的示例代码如下:
int main() {
Border arr(10); // 创建一个长度为 10 的数组
try {
arr[5] = 10; // 访问合法的索引
arr[20] = 20; // 访问非法的索引,会抛出异常
} catch (std::out_of_range& e) {
std::cout << e.what() << std::endl; // 输出异常信息
}
return 0;
}
在上面的代码中,我们创建了一个长度为 10 的 Border 数组,然后分别访问了合法和非法的索引。当访问非法的索引时,我们会捕获 std::out_of_range 异常,并输出异常信息。
不知道你这个问题是否已经解决, 如果还没有解决的话:问题解答:
在c++中,可以使用类的方法来检查数组是否越界。具体实现方法是,通过类Border实现[]运算符的重载。[]运算符重载形音参数有两个,一个是常量整数类型,用来表示数组下标。另一个是非常量整数类型,用来表示数组长度。在类中定义一个私有数据成员,用来存储数组长度,[]运算符重载时,先判断数组下标是否超限,如果超限,抛出自定义异常,否则正常返回对应元素的指针。以下是示例代码:
#include <iostream>
#include <exception>
using namespace std;
class Border
{
public:
Border(int length, int* arr): len(length), data(arr) {}
int* operator[](int i) const
{
if (i < 0 || i >= len) throw out_of_range("Array index out of range.");
return data + i;
}
private:
int len;
int* data;
};
int main()
{
int a[] = {1, 2, 3};
Border b(3, a);
try
{
int* p = b[10];
}
catch(out_of_range& e)
{
cerr << e.what() << endl;
}
return 0;
}