微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么按值调用的成员函数不像 c++ 中的普通函数那样?

在 C++ 中,对函数内部参数所做的更改不会反映在实际变量中,如果 函数的返回值是空的,但对于我们可以的成员函数来说,情况并非如此
看到永久发生的变化。

 #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++ 鼓励您考虑它们的方式。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。