有没有办法从函数内部更改外部对象

时间:2011-08-08 03:48:23

标签: c++ object-reference

是否可以定义一个函数,该函数在不使用指针等返回之后使参数引用另一个(已存在的)对象?同样,这不能仅通过使用复制构造函数或赋值运算符或任何东西来更改现有对象。当函数返回时,外部对象将引用不同的内存块。

例如:

int x;
void change(int& blah) {
    blah = x; // I don't want to change blah's value to x's value, I want to make blah refer to x outside the function
}

void main() {
    int something = 0;
    change(something);
    assert(&x == &something);
}

无论使用何种方法,都必须像

一样调用该函数
change(x);

在调用函数之前,不对参数应用任何特殊的运算符或函数。我不知道这是否可行,但如果是这样的话,它会变得非常酷。如果不是,我也想知道原因。

3 个答案:

答案 0 :(得分:5)

不,因为somethingx是不同的对象。它们不涉及不同的对象。它们不指向不同的对象。他们不同的对象。

要改变某些东西指向的地方,那东西需要成为一个指针。如果你有一个指针,你可以这样做:

int x;

void change(int*& p)
{
    p = &x;
}

int main()
{
    int something = 0;
    int* pointer = &something; // pointer points to 'something'
    change(pointer);           // now pointer points to 'x'
    assert(&x == pointer);
}

答案 1 :(得分:1)

绝对不可能。像int x这样的常规变量和像int &y(...)这样的引用变量和数组都不可重复,即它们总是将使用/指向同一块内存。

要获得所需的功能,您确实需要使用指针或指针的抽象。否则就不可能了。

作为一种解释的尝试,这里(不完全正确,并且非常简化,但足以得到这个想法):

当你声明一个像int x这样的变量时,你真的要求编译器将x与特定的内存区域相关联。因此,例如,假设x与从0x439FC2开始的四字节相关联。由于编译器知道x应始终引用0x439FC2,因此查找这些内存单元并将它们加载到寄存器中时,可以真正替换x的任何使用,将它们推送到堆栈,或其他什么。无论如何,最终结果是变量名x几乎被数字0x439FC2取代。因此,您无法移动x的原因是您无法使该内存地址引用内存中的其他位置。

同样,这种解释是简化的,并不完全正确,但它是关于自动分配变量的“直观”推理方式。

答案 2 :(得分:0)

您想使用对指针的引用:

void change(int &* blah, int * x){

  blah = x;
}

int * num1;
int num2 = 2;

change( num1, &num2 ); //num1 now points to num2