0

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

例如:

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);

在调用函数之前不对参数应用任何特殊运算符或函数。我不知道这是否可能,但如果是的话,它将使非常酷的事情成为可能。如果不是,我也想知道为什么。

4

3 回答 3

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);
}
于 2011-08-08T03:49:58.137 回答
1

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

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

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

当你声明一个类似的变量时int x,你实际上是在要求编译器x与特定的内存区域相关联。因此,例如,假设x与从 开始的四字节相关联0x439FC2。由于编译器知道x应该始终引用,因此可以通过查找那些内存单元并将它们加载到寄存器中,将它们推入堆栈或其他任何方式来真正替换 的0x439FC2任何使用。x无论如何,最终结果是变量 namex几乎被 number 所取代0x439FC2。所以你不能移动的原因x是你不能让那个内存地址指向内存中的不同位置。

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

于 2011-08-08T03:54:31.037 回答
0

您想使用对指针的引用:

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

  blah = x;
}

int * num1;
int num2 = 2;

change( num1, &num2 ); //num1 now points to num2
于 2011-08-08T03:52:39.880 回答