如果我有和任意类:
class myClass {
public:
int * getAddress() {
return &myVar;
}
int getMyVar() {
return myVar;
}
private:
int myVar;
};
我想说我想将变量的地址存储在另一个类中。如果做
有什么区别 int * address = myClassInstance.getAddress()
和
int * address = &myClassInstance.getMyVar()
我认为这两个都会给我相同的价值。有人可以解释这里到底发生了什么。
我现在正在假设的是,我的实例变量实际上并未被返回,而是返回了该值的副本,因此当我尝试访问其地址时我是真正访问一个随机地址,该地址在函数调用范围之外将不再有效。
答案 0 :(得分:1)
这是正确的。
当您致电myClassInstance.getMyVar()
时,它不会返回myVar
变量本身,而是返回其值的副本。
&myClassInstance.getMyVar()
无效,因为您不能获取临时副本的地址(这将是无用的,因为它会被立即销毁,然后您将拥有任何地址)。
答案 1 :(得分:1)
在这种情况下:
int * address = myClassInstance.getAddress();
您获得了myVar
成员调用getAddress()
方法的地址。之后address
包含myVar
成员的地址。到目前为止,非常好。
然而,在第二种情况下:
int * address = &myClassInstance.getMyVar();
getMyVar()
会返回一个临时int
,它是myVar
的副本。然后,您尝试获取此临时的地址,而不是myVar
,这应生成compilation error。
答案 2 :(得分:1)
你的假设是对的。第一个是会员的有效地址。第二个是“随机”堆栈地址到堆栈上创建的临时值。值得注意的是,如果你改变了:
int getMyVar() {
return myVar;
}
要
int &getMyVar() {
return myVar;
}
代码int * address = &myClassInstance.getMyVar()
完全有效,并产生与int * address = myClassInstance.getAddress()
相同的结果。