问题:使用三个私有成员声明一个名为'StudentRec'的类:int类型的'enrolNo',float类型的'CGPA'和string类型的'branch'。声明一个名为'Student'的对象数组,其大小为5,类为'StudentRec'。编写公共成员函数:(i)void sort(StudentRec Student [],int N)以相对于'CGPA'的升序对数据进行排序,以及(ii)void print(StudentRec Student [],int N)以显示排序和未分类的学生记录。写main以测试这些成员函数。
怀疑:排序部分我稍后会做。我怀疑的是,如果在下面的代码(第二行最后一行)Student[5].print(Student, N );
是调用函数print的正确方法吗?如何通过对象数组调用此函数同样Student[0].print(Student, N )
给出正确的输出。为什么?
#include<iostream>
#include<cstring>
using namespace std;
class StudentRec
{
private:
int enrolNo;
float CGPA;
string branch;
public:
void assign()
{
cin>>enrolNo>>CGPA>>branch;
}
void sort (StudentRec Student[], int N );
void print(StudentRec Student[], int N )
{
int i;
for(i=0; i<5; i++)
{
cout<<"Student"<<" "<<i<<" " ;
cout<<Student[i].enrolNo<<" "<<Student[i].CGPA<<" "<<Student[i].branch<<endl;
}
}
};
int main()
{
StudentRec Student[5];
int i,N=5;
for(i=0; i<5; i++)
Student[i].assign();
Student[5].print(Student, N );
return 0;
}
答案 0 :(得分:1)
正如已经指出的那样,Student[5].print(Student, N );
调用未定义的行为,因为没有Student[5]
。但是,print
的实现实际上并没有使用它所调用的对象,所以这可能就是为什么它在实践中有效。
为了让你的程序设计得有些合理,同时保持尽可能接近的分配,你可以声明函数static
:
static void print(StudentRec Student[], int N );
这意味着,虽然函数在类中声明并且可以访问类的对象的私有成员,但它们不依赖于要调用的任何具体对象。然后你可以像这样使用它们:
StudentRec::print(Student, N);
另外,print
的实施实际上并未使用参数N
。