将对象数组传递给相同的C ++类

时间:2017-10-25 09:03:07

标签: c++ arrays

问题:使用三个私有成员声明一个名为'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;
}

1 个答案:

答案 0 :(得分:1)

正如已经指出的那样,Student[5].print(Student, N );调用未定义的行为,因为没有Student[5]。但是,print的实现实际上并没有使用它所调用的对象,所以这可能就是为什么它在实践中有效。

为了让你的程序设计得有些合理,同时保持尽可能接近的分配,你可以声明函数static

static void print(StudentRec Student[], int N );

这意味着,虽然函数在类中声明并且可以访问类的对象的私有成员,但它们不依赖于要调用的任何具体对象。然后你可以像这样使用它们:

StudentRec::print(Student, N);

另外,print的实施实际上并未使用参数N