【发布时间】:2018-01-06 21:16:09
【问题描述】:
我编写了以下代码,运行良好。然而让我感到困惑的是,当我创建一个 Student 对象时,例如“a”,然后我在其上调用一个成员函数 a.calculator(a)。当我使用点运算符在同一个对象上调用函数时,我将同一个对象作为参数传递,这不是多余的吗?任何解释将不胜感激。
#include <iostream>
using namespace std;
struct Semester{
int credits;
int gradePoints;
};
class Student{
private:
string name;
string major;
Semester cgpa[8];
public:
Student();
Student(string name, string major);
int calculator(Student &a);
void enterGrades(Student &a);
};
Student::Student(){
name = "-";
major = "Undeclared";
}
Student::Student(string name_, string major_){
name = name_;
major = major_;
}
int Student::calculator(Student& a){
int cgpa = 0;
int gpa = 0;
for (int i = 0; i < 8; ++i){
gpa = (a.cgpa[i].credits * a.cgpa[i].gradePoints)/ a.cgpa[i].credits;
cgpa = cgpa + gpa;
}
return cgpa/8;
}
void Student::enterGrades(Student& a){
int credits;
int gp;
for (int i = 0; i < 8; ++i){
cout<<"Enter Semester "<<i+1<<" credits: ";
cin>>credits;
a.cgpa[i].credits = credits;
cout<<"Enter Semester "<<i+1<<" grade points: ";
cin>>gp;
a.cgpa[i].gradePoints = gp;
}
}
int main(){
Student a("Hasan", "CS");
a.enterGrades(a);
cout<<"The students CGPA is "<<a.calculator(a)<<endl;
}
【问题讨论】:
-
是的。您不需要这样做,只需使用
this。 -
您不需要将相同的对象传递给函数。你甚至不需要“这个”。您只需省略计算器定义中的参数并按原样使用数据成员,例如:cgpa[i].credits 而不是 a.cgpa[i].credits
-
一个成员函数可以作用于当前实例的类数据成员,这很可能是你想做的。正如@SpencerWieczorek 建议的那样,您可以先尝试从您定义的所有成员函数中删除
Stutend& a参数,然后将a.替换为this->。然后,您可以利用 this-> 在引用类数据成员(以及成员函数)时隐含在主体函数中的事实,并完全理解它 -
@StPiere Using this-> 工作正常,但是当我完全省略它时,我在计算器函数中收到错误“数组下标的无效类型 int[int]”
-
@Hassaan:请粘贴错误消息所针对的代码行