*this(Return 对调用对象的引用)不会 return 更改对象在该函数中的值

*this (Return reference to the calling object) does not return changed object's value in that function

假设有两个对象:num1,num2,每个存储整数 5。

我想使用非成员函数添加两个对象的值,所以结果是:10。

但是输出显示值:5。

class成员函数或*this指针是否有错误?

main.cpp

#include<iostream>
#include"Person.h"  
using namespace std ;

int main(){
    Person num1 ;
    Person num2 ;

    num1.InValueCapture(5) ;
    num2.InValueCapture(5) ;

    add(num1,num2);   //non class member function  : num1+num2 expecting result : 10           
    
    cout << "THE OUTPUT : " << num1.GetValueCapture() << endl; //but now we get 5 
    return 0 ;
}

Person.h

#ifndef PERSON.H
#define PERSON.H

struct Person{
private:
    int value_capture ;
public:

    int InValueCapture(int value){
        value_capture = value ;
    }

    int GetValueCapture() const {
        return value_capture ;
    }

    //adding two data
    Person& combine(const Person &Rdata)
    {
        value_capture += Rdata.value_capture ;
        std::cout << "value capture : " << value_capture <<std::endl; // use to check value inside DataSum.value_capture

        return *this ;
    }
};



Person add(const Person &Ldata , const Person &Rdata)       //nonmember function 
{
    Person DataSum = Ldata;
    DataSum.combine(Rdata);  // add Rdata to Ldata , call class function combine
    return DataSum ;        //
}

#endif

感谢您的指导,感谢您的帮助。

评论是骗子:

DataSum.combine(Rdata);  // add Rdata to Ldata , call class function combine

这不是“将 Rdata 添加到 Ldata”。您正在调用 DataSum 的方法,它是 LData 的副本。修改副本对原件没有影响 LData。不要复制:

void add(Person &Ldata , const Person &Rdata)       //nonmember function 
{
    Ldata.combine(Rdata);  // add Rdata to Ldata , call class function combine
}

实际上我不是 100% 确定函数应该做什么。如果要修改第一个参数,则不能将其作为 const 引用传递。如果你不想修改它传递 const 引用是好的,那么你可以 return 结果,但这已经是你的函数所做的,只是你忽略了 returned 值。我删除了 return 以更清楚地表明该函数修改了它的第一个参数。不过,现在调用者也可以直接调用 combine

改变

Person add(const Person &Ldata , const Person &Rdata)

[[nodiscard]] Person add(const Person &Ldata , const Person &Rdata)

add 是一个“纯”函数,因为它 returns L 和 R 的总和。

也不修改

执行此操作后:

add(num1,num2);   //non class member function  : num1+num2 expecting result : 10           

这会导致编译器错误,因为您所做的相当于 x+y 然后丢弃结果。

num1 = add(num1, num2);

做你想做的。

一个名为 add 的函数应该修改它的参数。

也许你应该拥抱操作。将 combine 更改为:

//adding two data
Person& operator+=(const Person &Rdata)&
{
    value_capture += Rdata.value_capture ;
    std::cout << "value capture : " << value_capture <<std::endl; // use to check value inside DataSum.value_capture

    return *this ;
}

add到:

// notice we take Ldata **by value**, making a copy
[[nodiscard]] Person operator+(Person Ldata, const Person &Rdata)  {
  Ldata += Rdata;
  return Ldata;
}

您的 main 代码将变为:

num1 = num1+num2;

num1 += num2;

他们都非常清楚自己应该做什么。