为什么按值调用的成员函数不像 c++ 中的普通函数?



在c++中,如果函数的返回值是void,但对于成员函数,情况并非如此,因为我们可以
看到永久发生的更改。

#include<iostream>
using namespace std;
class Student {

public:
int age;
float marks;
Student()
{
cout << "call by default";
}
void ageInc()
{
age = age + 1;
}
};
int main()
{
Student s;
s.age = 34;
cout << s.age << endl;
s.ageInc();
cout << s.age << endl;
return 0;
}

在c++中,如果函数的返回值为void ,则对函数内部参数所做的更改不会反映在实际变量中

对参数值的更改与函数的返回类型完全无关。void函数可以很容易地对其参数进行更改。这些更改是否反映回调用者与参数是否通过指针/引用传递有关。

但成员函数的情况并非如此,我们可以在其中看到永久发生的更改。

非静态类方法接收一个指向其被调用对象的隐藏this指针。当该方法访问其所属类的非静态成员时,它将使用该this指针访问该成员。因此,对成员所做的任何更改都是直接对注释器进行的。

您的示例大致相当于以下幕后操作:

#include <iostream>
using namespace std;
struct Student {
int age;
float marks;
};
Student_ctr(Student* const this)
{
cout << "call by default";
}
Student_dtr(Student* const this) {}
void Student_ageInc(Student* const this)
{
this->age = this->age + 1;
}
int main()
{
Student s;
Student_ctr(&s);
s.age = 34;
cout << s.age << endl;
Student_ageInc(&s);
cout << s.age << endl;
Student_dtr(&s);
return 0;
}

因为您没有更改参数。您的示例函数不带参数。您正在更改成员变量。

您可以认为对象的所有成员都是通过引用参数自动传递的,但这并不是C++鼓励您考虑它们的方式。

相关内容

  • 没有找到相关文章

最新更新