【问题标题】:Passing objects to functions in C++将对象传递给 C++ 中的函数
【发布时间】: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&amp; a 参数,然后将a. 替换为this-&gt;。然后,您可以利用 this-> 在引用类数据成员(以及成员函数)时隐含在主体函数中的事实,并完全理解它
  • @StPiere Using this-> 工作正常,但是当我完全省略它时,我在计算器函数中收到错误“数组下标的无效类型 int[int]”
  • @Hassaan:请粘贴错误消息所针对的代码行

标签: c++ function object


【解决方案1】:

当我使用点运算符在同一个对象上调用函数时,我传递同一个对象作为参数不是多余的吗?

如果你总是用同一个对象调用,那是多余的。但是,使用参数可以让您传递调用对象以外的另一个对象。

从另一个角度来看:函数是非静态成员函数是多余的,因为它不使用this 的任何成员。

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2011-01-09
    • 2013-12-26
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多