*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;
他们都非常清楚自己应该做什么。
假设有两个对象: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;
他们都非常清楚自己应该做什么。