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
相关产品推荐
相关产品推荐

