有如下题目,设计代码实现题目要求。
为了统计全年级学生考试成绩的分数段分布情况,即1~10、11~20、21~30、...、91~100等各个分数段的学生人数,拟设计实现一个重载了下标运算符的类,该类对象使用元素为考试成绩的数组和数组元素个数来初始化,当使用0~9的整数下标k来访问该对象时,返回 第k分数段(10*k + 1 <= e <= 10*k + 10)中的元素个数。
代码分文件编写:
//类声明
#pragma once
class ArrayStuScore
{
public:
ArrayStuScore(int length = 0); //有参构造函数定义
~ArrayStuScore(); //析构函数定义
int operator[](int num); //数组下标重载函数定义
int& func(int i); //数组赋值函数,通过左值引用的方式
private:
int m_Length; //数组长度
int* m_P; //数组指针
};
在头文件中定义一个ArrayStuScore类,类中定义有参构造函数、析构函数、下标[]重载函数、数组赋值函数func;
类中有两个私有成员变量,分别为数组长度和指向数组的指针;
有参构造函数的作用:为类成员变量数组长度赋值,这样在定义不同对象时,可以指定不同的数组长度;
析构函数:因类成员存在指针类型,当销毁类对象时,需要在析构函数中通过销毁指针而释放对象的数据;
下标[ ]重载函数:重载下标[ ],实现题目要求——当使用0~9的整数下标k来访问该对象时,返回 第k分数段(10*k + 1 <= e <= 10*k + 10)中的元素个数;
数组赋值函数func:外部定义的数组,通过成员变量指向数组的指针指向这个数组,需要注意这个函数是通过左值引用的方式给指针赋值;
//类中函数定义
#include "类声明.h"
#include <string>
ArrayStuScore::ArrayStuScore(int length)
{
m_Length = length;
if (length == 0)
{
m_P = NULL;
}
else
m_P = new int[length];
}
ArrayStuScore::~ArrayStuScore()
{
delete[] m_P;
}
int& ArrayStuScore::func(int i)
{
return m_P[i];
}
int ArrayStuScore::operator[](int num)
{
int count = 0;
for (int i = 0; i < m_Length - 1; i++)
{
if (m_P[i] >= 10 * num + 1 && m_P[i] <= 10 * num + 10)
{
count++;
}
}
return count;
}
上边一段代码是对类中函数的具体定义。
//主函数
#include <iostream>
using namespace std;
#include <string>
#include "类声明.h"
void test()
{
int arr[] = { 20,30,30,50,60,20,80,30,100,10,30,30,40,50,60,70,80,90,100,10,20,30,40,50,60,70,80,90,100,10 };
int num = sizeof(arr) / sizeof(int);
ArrayStuScore array(num);
for (int i = 0; i < num; i++)
{
array.func(i) = arr[i];
}
cout << array[2] << endl;
}
int main()
{
test();
system("pause");
return 0;
}
代码中,定义一个类,可以通过创建这个类的对象,实现将一个不定大小的数组传入这个对象中,并通过下标重载函数对这个数组进行操作。
数组长度通过有参构造函数传入,数组元素通过返回值类型为引用的成员函数传入。