提问人:UdayPalecha 提问时间:9/10/2023 最后编辑:UdayPalecha 更新时间:9/10/2023 访问量:88
为什么我们可以在对象中获取对象的值,但不能设置其值?
Why can we GET the value of an object within an object, but not SET its value?
问:
在下面的代码中,我创建了一个非常基本的模板类 Pair 及其 2 个对象 - p1 和 p2。
我可以使用 获取对象 p2 的数据成员 x 的值。cout << p2.getx().getx() << p2.getx().gety();
主要问题:
如果我可以通过这种方式获取值,那么为什么我不能使用 AND 设置 x 的值?(p2.getx()).setx('c');
(p2.getx()).sety(8.12);
法典:
#include<iostream>
using namespace std;
template <typename T, typename V> class Pair {
T x;
V y;
public:
void setx(T x) {
this->x = x;
}
T getx() {
return x;
}
void sety(V y) {
this->y = y;
}
V gety() {
return y;
}
};
int main()
{
Pair <char,int> p1; //Declared to put in p2
p1.setx('b');
p1.sety(12.23);
Pair <Pair<char,int>, double> p2;
p2.setx(p1);
p2.sety(24.36);
cout<<p2.getx().getx()<<" "<<p2.getx().gety()<<" "<<p2.gety()<<endl;
(p2.getx()).setx('c'); //Here, p2.getx()!=p1, even though we set p2.x=p1. This is because p2.getx() returns a value/copy of p1 (an instance), not an object (or var).
(p2.getx()).sety(8.12);
p2.setx(p1);
cout<<p2.getx().getx()<<" "<<p2.getx().gety()<<" "<<p2.gety()<<endl;
return 0;
}
到目前为止,我想我已经理解的是返回 p1 的副本,并且要使其工作,我必须让它返回对 p1 的引用。
但我仍然想明白的是,如果不起作用,如何仍然有效?p2.getx()
p2.getx().setx(value)
p2.getx().𝒔𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆)
p2.getx().𝒈𝒆𝒕𝒙()
答:
p2.getx().getx(value) 之所以有效,是因为您返回的是副本。
假设我有一个函数,它通过复制接受整数值,并递增它接收的值,我将一个传递给该函数。
的正文将能够阅读,因为它是 的副本。如果你运行,然后你会发现第一行将打印 51,第二行将打印 50,这基本上意味着通过副本只会在写入对象而不是读取方面产生问题。如果要更改函数中对象的值,则应通过引用传递它,在示例中,第一个函数应返回引用,因为您正在链接两个调用int functionX(int x)
++x
int value_int = 50
functionX
x as 50
value_int
std::cout << functionX
std::cout << value_int
评论
对于您的主要问题,您的 getx() 方法返回 ,如果您为此副本设置值,则不会影响 。如果要更改 ,则方法应返回如下引用:a copy of x inside p2
the x inside p2
the x inside p2
getx()
T& getx() { return x; }
对于这个问题:“但我仍然想了解的是,如果不起作用,如何仍然有效?p2.getx().𝒔𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆)
p2.getx().𝒈𝒆𝒕𝒙()
p2.getx().𝒔𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆)
不起作用,因为您没有像我之前解释的那样直接设置。 之所以有效,是因为第一个 getx() 返回 ,第二个 getx() 将调用副本的 getx(),所以它有效。the x inside p2
p2.getx().𝒈𝒆𝒕𝒙()
a copy of x inside p2
希望我能澄清清楚。
评论
What I think I've understood so far is that p2.getx() returns a copy of p1, and to make p2.getx().setx(value) work, I would have to make it return a reference to p1.
正确。 你得到了副本的 x,为什么这不应该工作?ut still what I would like to understand is that if p2.getx().𝒔𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆) doesn't work, how does p2.getx().𝒈𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆) still work?
So does this mean that p2.getx().𝒔𝒆𝒕𝒙(𝒗𝒂𝒍𝒖𝒆) is working in the background but there is no way to see it since it is changing the value of p1's copy?
是的。 它在下一个分号处不复存在。If it is so then is there a way to see the change in p1's copy?