You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中向函数传递对象:调用成员函数时传自身对象是否冗余?

为什么调用成员函数时传入同一个对象是冗余的?

你完全没错,这种写法确实是冗余的——这是因为你没用到C++成员函数里一个核心的隐藏特性:this指针。让我给你拆解清楚:

核心原因:成员函数自带this指针

每个非静态成员函数在被调用时,编译器都会自动给它传入一个隐藏的指针参数this,这个指针指向的就是调用该函数的对象。比如你执行a.enterGrades(a)时:

  • 函数enterGrades已经通过this指针知道你正在操作对象a
  • 你额外传入的a参数完全是重复的,属于多余的操作

如何修改代码消除冗余

我们可以去掉成员函数的Student&参数,直接在函数内部通过this(或者直接访问成员变量)操作当前对象的属性。修改后的代码如下:

#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(); // 移除冗余参数
    void enterGrades(); // 移除冗余参数
};

Student::Student(){
    name = "-";
    major = "Undeclared";
}

Student::Student(string name_, string major_){
    name = name_;
    major = major_;
}

int Student::calculator(){
    int totalGpa = 0;
    // 直接访问当前对象的cgpa,等价于this->cgpa[i]
    for (int i = 0; i < 8; ++i){
        // 处理credits为0的情况,避免除零错误
        if (cgpa[i].credits == 0) {
            continue; // 也可以添加错误提示或抛出异常
        }
        int gpa = (cgpa[i].credits * cgpa[i].gradePoints) / cgpa[i].credits;
        totalGpa += gpa;
    }
    return totalGpa / 8;
}

void Student::enterGrades(){
    int credits;
    int gp;
    // 直接操作当前对象的cgpa数组
    for (int i = 0; i < 8; ++i){
        cout << "Enter Semester " << i+1 << " credits: ";
        cin >> credits;
        cgpa[i].credits = credits;
        cout << "Enter Semester " << i+1 << " grade points: ";
        cin >> gp;
        cgpa[i].gradePoints = gp;
    }
}

int main(){
    Student a("Hasan", "CS");
    a.enterGrades(); // 无需传递参数
    cout << "The student's CGPA is " << a.calculator() << endl; // 无需传递参数
}

额外的小优化提醒

原代码中calculator函数里的gpa计算可以简化:

// 原代码
gpa = (a.cgpa[i].credits * a.cgpa[i].gradePoints)/ a.cgpa[i].credits;
// 简化后(前提是credits不为0)
gpa = cgpa[i].gradePoints;

因为分子分母的credits会直接抵消,这样写更高效也更清晰。

内容的提问来源于stack exchange,提问作者Hassaan Hasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:40:51