通过引用传递的行为及其范围

Behaviour of pass by reference and its scope

本文关键字:范围 引用      更新时间:2023-10-16

在下面的代码中,变量a通过引用传递给构造函数,由参数x接收。然后x作为对属性的引用传递。然后使用值 3 初始化该属性。程序在运行时输出值 3。

我的问题

程序不应该崩溃或显示 2 吗,因为在调用构造函数之后 x 应该超出范围并被释放,其地址应该被释放。尝试写入它应该会违反内存访问。然而,在这种情况下,x仍然在程序控制中,保存着'a'的地址

。这是有效的 c++ 行为还是我错过了什么?

#include <iostream>
#include <conio.h>
using namespace std;
class myclass {
public:
int& attribute;
myclass(int& x):attribute(x) {
}
void func() {
attribute = 3;
}
};
int main() {
int a = 2;
myclass obj(a);
obj.func();
std::cout << a;
_getch();
}

不,这个程序很好。attribute是对a的引用。x已经超出范围的事实既不在这里也不在那里。

如果您将代码更改为

myclass(int x):attribute(x)

那将是一个问题。

程序逐行

的行为变量"a"初始化为值 2

int a = 2;  

使用变量初始化obja

myclass obj(a);  

首先x成为对a的引用,然后attribute成为对x的引用。因此,attribute成为对a的引用,它目前的值为 2。

myclass(int& x):attribute(x) {}  

obj的呼叫func()

obj.func();

attribute是对a的引用。 "属性"和"a"都更改为 3。将它们视为相同, 单个变量,仅具有差异别名。 这意味着,此时,attributea指的是同一个变量, 并且可以互换使用。

void func() {
attribute = 3;  
}