返回的实例变量的地址与实例变量的返回地址

时间:2018-02-04 21:45:40

标签: c++ reference return-value

如果我有和任意类:

class myClass {
public:
    int * getAddress() {
        return &myVar;
    }

    int getMyVar() {
        return myVar;
    }
private:
    int myVar;

};

我想说我想将变量的地址存储在另一个类中。如果做

有什么区别

int * address = myClassInstance.getAddress()

int * address = &myClassInstance.getMyVar()

我认为这两个都会给我相同的价值。有人可以解释这里到底发生了什么。

我现在正在假设的是,我的实例变量实际上并未被返回,而是返回了该值的副本,因此当我尝试访问其地址时我是真正访问一个随机地址,该地址在函数调用范围之外将不再有效。

3 个答案:

答案 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()相同的结果。